Expect工具的安裝及使用方法

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個參數。這裏argv argc表示傳入參數的個數,$argv0表示腳本名字。

另外我們也可以使用[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服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章