linux expect 安裝 Expect是在Tcl基礎上建立起來的,它還提供了一些Tcl所沒有的命令,它能夠用來作一些linux下沒法作到交互的一些命令操做,在遠程管 理方面發揮很大的做用。 spawn命令激活一個Unix程序來進行交互式的運行。 send命令向進程發送字符串。 expect 命令等待進程的某些字符串。 expect支持正規表達式並能同時等待多個字符串,並對每個字符串執行不一樣的操做.linux
A. Tcl 安裝 主頁: http://www.tcl.tk 下載地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml 1.下載源碼包 wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 2.解壓縮源碼包 tar xfvz tcl8.4.11-src.tar.gz 3.安裝配置 cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
安裝完畢之後,進入tcl源代碼的根目錄,把子目錄unix下面的tclUnixPort.h copy到子目錄generic中。 暫時不要刪除tcl源代碼,由於expect的安裝過程還須要用。shell
B. expect 安裝 (需Tcl的庫) 主頁: http://expect.nist.gov/ 1.下載源碼包 wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download 2.解壓縮源碼包 tar xzvf expect5.45.tar.gz 3.安裝配置 cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
自動切換登錄用戶的腳本與執行 如何可以將輸入密碼的工做在shell裏面自動完成,研究發現這種交互式的工做,普通的shell實現不了,聽說能夠藉助expect來搞定:bash
例子:函數
實現從普通用戶「test」切換到root用戶,自動輸入root的密碼,不用在終端提示符下執行密碼輸入操做。 步驟: (1)建立並打開腳本文件 vi autosu.sh (2)編輯腳本內容 #! /usr/expect/bin/expect -f //指定expect工具的路徑,若是不清楚具體路徑,能夠用"which expect"命令來查看。 spawn su - // 在expect 中用"spawn"關鍵字來調用命令「su - 」 expect ":" //在執行了su - 命令以後,提示輸入密碼的提示符。例如你在執行了su - 命令以後,終端裏面會出現提示「口令:」,那麼你就能夠在這裏寫expect ":",或者expect -exact "口令:" send "rootpasswd/r" //這裏expect用send將你的root密碼自動輸入到上面的提示符以後。 interact //操做完成。 (3)執行腳本文件 ./autosu.sh 注意:執行腳本時要注意的地方,不能按照習慣來用sh **.sh來這個expect的程序,會提示找不到命令,由於expect用的不是bash因此會報錯。執行的時候直接./**.sh就能夠了。
Linux Expect命令詳解:工具
http://www.xuetimes.com/archives/781 http://www.tuicool.com/articles/63iy2mui
Linux/Unix 程序退出狀態詳解:spa
http://blog.csdn.net/Hadas_Wang/article/details/43601981?locationNum=2.net
附註:unix
對於 *NIX 系統而言,每一條命令,無論是內置的,SHELL 函數仍是外置的,當它退出時,都 會返回一個小整數給引用它的程序,這就是程序退出狀態 ( exit status ). 通常來說,退出狀態 0 表示正常執行,沒有遭遇任何問題。其餘非零的狀態碼均表示失敗。 在 shell 中,可使用 $? 來訪問最後一個程序的退出狀態。 下面是 POSIX 的結束狀態: 退出狀態碼 含義 0 命令成功退出 > 0 在重定向或者單詞展開期間(~、變量、命令、算術展開以及單詞切割)失敗。 1 – 125 命令不成功退出。特定的退出值的含義,有各個命令自行定義。 126 命令找到了,可是文件沒法執行。 127 命令沒有找到 > 128 命令因收到信號而死亡。 POSIX 沒有定義 128 的狀態碼,僅要求它表示某種錯誤。由於只有低位的 8 個位會返回給父進程,所以,全部大於 255 的退出狀態都會被對 256 取模,而後將其結果做爲實際的 exit status code. 在 shell 腳本中,可使用 exit integer_value 這種方式聲明退出狀態。若是沒有顯式地聲明,則會以最後一個程序的退出狀態做爲當前腳本的退出狀態。也可使用 exit $? 來表示。
Expect 的默認Exit value爲0: exit 等價於 exit 0 所以,當expect中執行了子命令時(如shell命令),要想在expect退出時獲得子命令的退出狀態,就須要再Exepect退出時對exit value從新賦值。code
賦值方法:待續。。