Linux 下 expect 腳本語言中交互處理常用命令
1. #!/usr/bin/expect
告訴操作系統腳本里的代碼使用那一個 shell 來執行。這里的 expect 其實和 Linux 下的 bash、windows 下的 cmd 是一類東西。
注意:這一行需要在腳本的第一行,從而告知操作系統采用 expect 作為 shell 執行腳本。
注意:當使用 #!/usr/bin/expect -d 時,expect 腳本將運行在調試模式,屆時腳本執行的全過程將被展示出來。
2. set timeout
設置超時時間,計時單位是:秒,timeout -1 為永不超時。
例如:set timeout 30 為設置超時時間為 30 秒。則當某個 expect 判斷未能成功匹配的 30 秒后,將跳過該 expect 判斷,執行后續內容。
3.spawn
它主要的功能是給運行進程加個殼,用來
傳遞交互指令。
spawn 是進入 expect 環境后才可以執行的 expect 內部命令,如果沒有裝 expect 或者直接在默認的 shell 下執行是找不到 spawn 命令的。所以不要用 “which spawn“ 之類的命令去找 spawn 命令。好比在 windows 里的 dir 就是一個內部命令,這個命令由 shell 自帶,你無法找到一個 dir.com 或 dir.exe 的可執行文件。
例如:spawn ssh -l username 192.168.1.1 將為 ssh -l username 192.168.1.1 加殼,屆時該命令的交互指令將可以被處理。
4.expect
這里的 expect 是 expect 的一個內部命令,需要在 expect 環境中執行。該命令用於判斷交互中上次輸出的結果里是否包含某些字符串,如果有則立即返回。否則如果有設置超時時間,則等待超時時長后返回。
例如:expect "password:" 為判別交互輸出中是否包含 "password:" 字符串。
5.send
該命令用於執行交互動作,與手工輸入動作等效。
注意: 命令字符串結尾別忘記加上 "\r"(
換行符),如果出現異常等待的狀態可以核查一下。
例如:send "ispass\r" 為交互中輸入 "is pass\r"。
6.interact
執行完成后保持交互狀態,把控制權交給控制台,這個時候便可以手工操作。如果沒有該命令,命令完成后即退出。
7.$argv 參數數組
expect 腳本可以接受從 bash 傳遞過來的參數。
其中通過 [lindex $argv n] 可以獲得第 n 個參數的值,通過 [lrange $argv a b] 可以獲取 a-b 的參數值。
例如:編寫 test.sh 腳本,內容如下。
#!/usr/bin/expect
set timeout 2
set username [lindex $argv 0]
set password [lindex $argv 1]
set hostname [lindex $argv 2]
spawn /usr/bin/ssh $username@$hostname
expect {
"yes/no"
{send "yes\r"; exp_continue;}
"Password:"
{send "$password\r";}
}
expect eof
則通過調用腳本 ./test.sh oracle password 192.168.87.1 可以使用 oracle 用戶以密碼 password 登錄 192.168.87.1,
腳本最后自動登出。
8.exp_continue
exp_continue 附加於某個 expect 判斷項之后,可以使
該項被匹配后,還能繼續
匹配該 expect 判斷語句內的
其他項。exp_continue 類似於控制語句中的 continue 語句。
例如:下例將判斷交互輸出中是否存在 yes/no 或 *assword。如果匹配 yes/no 則輸出 yes 並
再次執行判斷;如果匹配 *assword 則輸出 123abc 並結束該段 expect 語句。
expect {
\"yes/no\" {send \"yes\r\"; exp_continue;}
\"*assword\" {set timeout 300; send \"123abc\r\";}
}
注意:exp_continue [-continue_timer] 默認情況下 exp_continue 會重高超時時鍾,-continue_timer 選項會阻止時鍾重新計數(連續計數)。