Ⅰ 什麼是shell
Shell本身是一個用C語言編寫的程序,它是用戶使用Unix/linux的橋梁,用戶的大部分工作都是通過Shell完成的。Shell既是一個命令語言,又是一個程序設計語言。作為命令語言,它互動式地解釋和執行用戶輸入的命令;作為程序設計語言,它定義了各種變數和參數,並提供了許多在高級語言中才具有的控制結構,包括循環和分支。
Shell是一個應用程序,是用戶管理應用程序的一個介面。
Ⅱ 如何隱藏 Shell腳本 源碼
將核心邏輯使用二進製程序代替,比如java,編譯後的python等,也可以使用shc編譯shell腳本,使其變為二進制文件達到影藏代碼的作用
Ⅲ shell命令解釋器源代碼
要求實現一個簡單的命令解釋器,也就是linux中的shell程序,在本程序中我們將其起名為ysh,要求:
1、 能夠執行外部程序命令,命令可以帶參數;
2、 能夠執行fg、bg、cd、history、exit等內部命令;
3、 使用管道和輸入輸出重定向;
4、 支持前後台作業,提供作業控制功能,包括列印作業的清單,改變當前運行作業的前/後台狀態,以及控製作業的掛起、中止與繼續運行;
5、 使用Make工具建立工程;
6、 使用調試器gdb來調試程序;
二、 實驗現象:
本程序的ysh程序設計不包括對配置文件和命令行參數的支持。要求ysh提供一個命令提示符,如ysh>,表示接受用戶輸入,每次執行完成後,再列印下一個命令提示符ysh>,當用戶沒有輸入時,ysh需要一直處於等待輸入狀態,同時在屏幕上顯示一些必要的信息。
三、 Ysh解釋程序的具體要求:
1、 外部命令和內部命令:
在大多數情況下,用戶輸入的命令是執行存儲在文件系統下中的可執行程序,我們稱之為外部命令或外部程序。Ysh應當支持在執行這些程序時可以將輸入/輸出重新定向到一個文件,並允許若干個程序使用管道串聯起來。我們把由管道連接起來的符合命令以及單獨使用的命令成為作業。
外部命令的形式是一系列分隔的字元串。第一個字元串可以是可執行程序的名字,其它的是傳遞給這個外部程序的參數。如果第一個字元串所聲名的可執行文件並不存在或者不可執行,則認為這個命令是錯誤的。
解釋器還必須支持一些內部命令,這些命令在ysh內部實現了特定的動作,下面是一些內部命令,如果用戶提交了一個內部命令,ysh應按照下面的描述執行相應動作。
�8�5 exit:退出ysh。
�8�5 jobs:列印當前正在後台執行的作業和掛起的作業信息。輸出信息應採用便於用戶理解的格式。
�8�5 fg %<int>:把<int>所標識的作業放到前台運行,如果這個作業原來已經停止,那麼他繼續運行。Shell應當在列印新的命令提示行之前等待前台運行的子進程結束。
�8�5 Bg %<int>:在後台執行<int>標識的已掛起的進程。
2、 命令行:
當用戶在提示符後面輸入命令時,輸入的整行內容叫做「命令行字元串」,ysh應當保存每一條命令行字元串,直到它表示的作業執行結束,其中包括後台作業和被掛起的作業。
3、 前台和後台作業
ysh應當能夠執行前台和後台作業。Shell在前台執行結束之前要一直等待。而在開始執行後台作業時要立刻列印出提示符ysh>,讓用戶輸入下一條命令。
前台作業的執行總是優先於一個後台作業,ysh不需要在列印下一個提示符前等待後台作業的完成,無論是否有後台作業的執行,只要完成一個前台作業,便立即輸出提示符ysh>;一個後台作業結束時,ysh應當在作業結束後立刻列印出一條提示信息。
4、 特殊鍵:
又稱組合鍵。通過終端驅動程序,特殊的組合鍵可以產生信號給ysh,程序應當對這些信號做出適當的響應。
�8�5 Ctrl + Z:產生SIGTSTP信號,這個信號不是掛起ysh,而是讓shell掛起在前台運行的作業,如果沒有任何前台作業,則該特殊鍵無效。
�8�5 Ctrl+C:產生SIGINT信號,這個信號不是中止ysh,而是通過ysh發出信號殺死前台作業中的進程。如果沒有任何前台作業,則該特殊鍵無效。
5、 分析用戶輸入:
a) 分隔符和特殊字元
分析用戶輸入的語法分析器應具有下面介紹的功能,它能夠檢查用戶的輸入錯誤。如果用戶輸入的某些地方出錯了,ysh應當給出合理的出錯信息。
ysh每次接受用戶輸入的一行命令,在用戶按下回車鍵(Enter)後開始執行分析動作。空名令不產生任何操作,而只是列印一個新的提示符。
定義空格符為分隔符,ysh應能處理命令行中間和前後出現的重復空格符。
某些字元被稱做「元字元」,它們在用戶輸入的上下文中具有特殊的定義。這些字元包括」&、|、<、>」。Shell假設這些字元不會出現在程序名、參數名、文件名中,他們是ysh的保留字元。
b) 內部命令:
如果命令行字元串符合前面介紹的內部命令的格式,它就當作一個內部命令被解釋。如果不是,就要考慮可能是外部程序的執行,或者是錯誤的。
c) I/O重定向:
一個程序命令後面可能還跟有元字元「<」或「>」,他們是重定向符號,而在重定向符號後面還跟著一個文件名,在」<」的情況下,程序的輸入被重定向到一個指定的文件中去。在」>」的情況下,程序的輸出被重定向到一個指定的文件中。如果輸出文件不存在,需要創建一個輸出文件。如果輸入文件不存在,則認為出現了錯誤。
d) 管道和協同程序
在一條命令行中當若干個命令被元字元「|」分開時,這個元字元代表管道符號。在這種情況下,ysh為每一個子命令都創建一個進程,並把它們的輸入、輸出用管道連接起來。
例如下面這條命令行:
progA argA1 argA2 < infine | progB1 > outfile
應生成progA 和progB 兩個進程,ProgA的輸入來自文件infile,porgA的輸出是progB的輸入,並且progB的輸出文件是outfile。這種命令行可以通過進程間通信中的管道來實現。
含有一個和多個管道的命令會在如下幾種情況下產生錯誤:
�8�5 當其任何一個子程序執行出錯時。
�8�5 除了第一個子程序以外其它子程序的輸入被重定向。
�8�5 除了最後一個子程序以外的其它子程序的輸出被重定向。
由管道連接的多個進程所組成的作業只有當其所有子進程都執行完畢後才算結束。
e) 後台作業
當用戶需要在後台執行一個作業時,可以在作業命令的後面加上元字元「&」。用戶以該種方式輸入的作業命令都必須放在後台執行,同時並不影響用戶與終端的交互
Ⅳ iOS開發-需要了解的Shell腳本語法
Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。在iOS開發中,我們通常編寫一些自動化的腳本文件,來提高我們的生產效率,其本質就是通過Shell腳本對一些 xcodebuild , xcode-select , xcpretty , xcrun 等指令的封裝。本篇文章,我們就針對 Shell 腳本的語法,做一些羅列,以輔助我們去完成一些自動化封裝。
執行腳本
.sh 文件為 Shell 腳本文件格式,通過 sh 指令執行腳本文件
執行結果:
1.通過 echo 輸出變數時,需要使用 $ 或者 ${} 修飾
2. (重點)定義變數時,等號之間不能有空格,不然會誤認為變數為一個指令
3.可以直接修改 name 變數的值,即當前 name 默認為 readwrite 許可權
4.我們給 _var 用 readonly 修飾後,再修改值會拋出異常
執行結果:
執行結果:
執行結果:
執行結果:
$@ 和 $* 都是輸出所有參數,前者是 "$1" "$2" "$3" "$4" ,後者是 "$1 $2 $3 $4"
執行結果:
注意:條件表達式要放在方括弧之間,並且要有空格,例如: [$a==$b] 是錯誤的,必須寫成 [ $a == $b ] 。
關於文件檢測運算符,這里還是都羅列一下吧,比較重要:
執行結果:
執行結果:
執行結果:
執行結果:
2.有參數
執行結果:
注意: $10 不能獲取第十個參數,獲取第十個參數需要 ${10} .
使用 man 查詢 指令文檔
比如我們想查看 xcodebuild 指令下都有哪些操作,直接在終端執行:
當我們不清楚某一個指令下的操作時,就可以通過 man 查詢,然後輔助我們來編寫 Shell 指令。
在iOS下,了解下這些 Shell 語法就足夠了,已經可以幫助我們完成大部分的 Shell腳本 的編寫或者閱讀別人的 Shell 源碼。不需要記憶,簡單看下就可以。
Ⅳ linux shell源代碼
下載個 coreutils 網址:http://download.chinaunix.net/download/0002000/1778.shtml
下載完->解壓-> 源碼在src 文件夾內,windows打開 可以用VC6.0 或SourceInsight等看代碼軟體,再
次祝你更上一層樓,呵呵
Ⅵ linux下shell命令源碼在哪裡
需要root身份才能使用的命令一般放在/sbin/usr/sbin下面.而普通用戶的命令放在/bin/usr/bin下面
Ⅶ shell是什麼意思
shell是殼的意思,通常為了保護自己的軟體源碼不被別人窺視,就會給自己的軟體加殼。一些病毒和木馬為了保護自己不被殺毒軟體查出來殺掉,也會加殼。
Ⅷ LINUX對shell命令的攔截
樓主,shell 接收到一個 非內部命令 (如 ls, find)時,不是把命令提交給內核的,這個概念是錯誤的。 shell 應該是 fork 出一個進程,這個子進程調用 exec* 系列系統調用 (比如 execlp 等)來載入ls, find等可執行程序執行, 而此時的shell進程本身會 通過 wait 系統調用等待子進程完成。
由上可見,一個進行攔截的地方可以放在 exec 系列調用中,exec是實現在 glibc 里的,所以你只要下載 glibc (或者你們系統使用的 libc )的源碼,在 exec 調用中加入你的攔截代碼。 編譯修改後的glibc,替換系統中的glibc即可。
另外要注意的是,除了shell,其他程序也可能使用 fork+exec 來執行某些命令,如果不想攔截這種情況,在攔截時需判斷一下當前進程的父或祖進程,看看是否是shell進程。
最後,glibc實在是太重要了,是所有程序的基礎,改動需小心。