Linux 下 expect 腳本語言中交互處理經常使用命令windows
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 選項會阻止時鐘從新計數(連續計數)。