Expect是一個用來處理交互的工具,通常用於需要手動輸入數據的場景,可在腳本中使用expect來實現自動化。
安裝
首先查看系統中是否有安裝expect。
# whereis expect
Expect工具是依賴tcl的,所以也需要安裝tcl。
首先下載並安裝tcl,這裏安裝8.4.19版本。
# wget https://sourceforge.net/projects/tcl/files/Tcl/8.4.19/tcl8.4.19-src.tar.gz
# tar zxvf tcl8.4.19-src.tar.gz
# cd tcl8.4.19/unix && ./configure
# make
# make install
然後下載expect並安裝。
# wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
# tar zxvf expect5.45.tar.gz
# cd expect5.45
# ./configure --with-tcl=/usr/local/lib --with-tclinclude=../tcl8.4.19/generic
# make
# make install
# ln -s /usr/local/bin/expect /usr/bin/expect
注意這裏的configure命令需要使用–with-tclinclude選項傳入tcl安裝包中的generic文件夾路徑。
安裝完成之後運行expect命令,查看是否安裝成功。
# expect
expect1.1>
基本操作
Expect腳本中常用的命令包括spawn, expect, send, interact等。
spawn
該命令用於啓動一個子進程,執行後續命令
expect
該命令從進程接受字符串,如果接受的字符串和期待的字符串不匹配,則一直阻塞,直到匹配上或者等待超時才繼續往下執行
send
向進程發送字符串,與手動輸入內容等效,通常字符串需要以’\r’結尾。
interact
該命令將控制權交給控制檯,之後就可以進行人工操作了。通常用於使用腳本進行自動化登錄之後再手動執行某些命令。如果腳本中沒有這一條語句,腳本執行完將自動退出。
set timeout 30
設置超時時間timeout爲30s,expect命令阻塞超時時會自動往下繼續執行。將timeout配置爲-1時表示expect一直阻塞直到與期待的字符串匹配上才繼續往下執行。超時時間timeout默認爲10s。
[lindex $argv n]
可以在腳本中使用該命令獲取在腳本執行時傳入的第n個參數。這裏
另外我們也可以使用[lrange $argv sn en]命令獲取第sn到第en個參數。
實例解析
這裏我們寫一個腳本,命名爲restart_service.exp,該腳本先切換到指定賬戶,然後下載軟件包到tomcat的webapps目錄,然後重啓tomcat服務。
#!/usr/bin/expect
set timeout -1
set user [lindex $argv 0]
set password [lindex $argv 1]
set cmd_prompt "# "
spawn su ${user}
expect ${cmd_prompt}
send "${password}\r"
expect ${cmd_prompt}
send "cd /opt/tomcat/webapps && wget http://host/path/to/package.war\r"
expect "100%"
# 直到wget下載任務打印出100%才表示軟件包下載完成
expect ${cmd_prompt}
send "/opt/tomcat/bin/shutdown.sh\r"
expect ${cmd_prompt}
send "/opt/tomcat/bin/startup.sh\r"
expect eof
#interact
# 所有腳本必須以expect eof或者interact結束,一般自動化腳本以expect eof結束就行了
運行expect restart_service.exp tomcat tomcat123
命令,腳本將使用tomcat賬戶下載軟件包並重啓tomcat服務。