Linux交互命令工具expect與自動切換登陸用戶

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

賦值方法:待續。。

相關文章
相關標籤/搜索