在linux下進行一些操作時,有時需要與機器進行一些交互操作,比如切換賬號時輸入賬號密碼,傳輸文件時輸入賬號密碼登陸遠程機器等,但有時候這些動作需要在shell腳本中進行,這個時候就可以使用expect來進行自動的交互操作,從而避免需要人工干預引起的腳本中斷執行。
expect的核心命令:spawn expect send set
spawn 調用要執行的命令
expect 等待命令提示信息的出現,也就是捕捉用戶輸入的提示:
send 發送需要交互的值,替代了用戶手動輸入內容
set 設置變量值
interact 執行完成后保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登錄完成后會退出,而不是留在遠程終端上。
expect eof 這個一定要加,與spawn對應表示捕獲終端輸出信息終止,類似於if....endif
(expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就夠了。)
例子:建一個scp.sh腳本,用來傳輸文件
#!/bin/sh svr="9.84.214.35" expect <<! spawn scp -r xman@$svr:/db2info.csv /tmp/db2info.txt expect { "(yes/no)?" { send "yes\n" expect "*assword:" {send "1qaz2wsx\n"} } "*assword:" { send "1qaz2wsx\n" } } expect "100%" expect eof !
執行./scp.sh就會使用賬戶xman,去登陸遠程機器,這是終端會給出提示信息問是否繼續Yes/No? 如果yes就輸入密碼,登陸成功后scp命令就開始傳文件。其中expect{}里面的代碼就是預判斷終端輸出的內容里是否有(yes/no)?,如果有就自動輸入yes,(send "yes\n");然后再判斷后面的輸出里是否含有*password:",如果有就自動輸入預置的密碼1qaz2wsx。從而達到自動進行交互的目的。
除了用 expect <<! !方式(here document方式)在sh中調用expect外,當然也可以用expect -c "" 的方式在sh腳本里調用expect命令。