本文主要包括兩個部分:expect命令的使用示例和對該示例進行說明。
1. expect命令的使用示例
IP=192.168.1.18 PASS=passwd expect -c " settimeout 60; spawn ssh [email protected] expect{ \"*yes/no*\"{send \"yes\r\"; exp_continue} \"*password*\"{send \"$PASS\r\";} } expect eof"
2. 針對示例,對expect命令的使用進行說明
(1) -c 標誌之後的命令在任何腳本之前執行,該命令應當被引用以防止被 shell 破壞。
(2) set timeout 60:設置超時時間,計時單位爲秒,timeout -1 爲永不超時。
(3) spawn是expect的初始命令,用於啓動一個進程,之後所有的expect操作都在這個進程中進行,如果沒有spawn語句,整個expect就無法進行下去,當然,如果真的不要spawn過程也沒有關係,雖然這樣就沒有辦法單獨執行,但是這個腳本可以與任何調用它的進程進行交互。
(4) expect用於等候一個相匹配的輸出,一旦匹配就執行後面的動作。在這個例子中,expect是依附於spawn命令的,當spawn後面的命令執行完畢後,expect命令就匹配命令執行後的關鍵詞(yes/no),如果匹配到,就執行後面{ }中動作。
(5) expect的匹配可以看做是一個循環,通常匹配之後都會退出語句,但如果有exp_continue,則可以不斷循環匹配。在該例子中,遇到“yes/no”時,送出“yes”,然後繼續expect,遇到密碼提示時,送出密碼,送完後退出。
(6) eof是必須去匹配的,在 spawn 進程結束後會向 expect 發送 eof;如果不去匹配,有時也能運行,比如 sleep 多少秒後再去 spawn 下一個命令,但是不要依賴這種行爲,很有可能今天還可以,明天就不能用了。但是,如果不需要spawn的進程結束,不能 expect eof 了,如下面的例子:
#!/usr/bin/expect set timeout 30 spawn ssh 10.192.224.224 expect"password:" send"mypassword\n" expect "*$" send "mkdirtmpdir\n" expect"*$"
手動操作時 ssh 實際上也不會自己結束除非你 exit;所以你只能expect bash 的提示符,當然也可以是機器名等,這樣纔可以在遠程創建一個目錄。