expect命令,是基於tcl的一門語言,其內在原理和早期的chat一樣;
是用於實現用戶和程序之間的交互自動化進行的工具。
一、expect語法構成:
expect可單獨寫一個腳本:
#!/usr/bin/expect -f
set timeout 5
spawn COMAND
expect PATTERN0 {
send "STRING0\r"
exp_continue
}
expect {
PATTERN1 {
send "STRING1\r"
exp_continue
}
PATTERN2 {
send "STRING2\r"
exp_continue
}
}
expect "PATTERN3"
exp_send "STRING3\r"
以上混用了三種不同的expect書寫格式;
其中,PATTERN默認只支持glob通配規則(*和?等),只需-re PATTERN 即可支持擴展正則表達式匹配了。
注意:所有{ } 的前面都需要一個空格隔開;
二、子命令解釋:
set 創建變量,[lindex $argv 0] 表示引用腳本參數中的第一個值;[lindex $argv 0-2] 表示引用腳本參數中第0到2個值。
set timeout # 設置等待交互執行結束的超時時間並繼續執行下去,為 -1 永不超時;
send =exp_send 用於向進程發送字符串,支持換碼符,\r 表示回車;
選項:
-i 指定spawn_id,針對不同spawn對象來發送信息;是進行多程序控制的關鍵參數
-s 表示slowly,控制發送速度,send -s 相當於 send_slow
send -s {10 .001} 表示每10個字符一傳送,傳送間隔為1毫秒
expect 從進程中接受字符串,類似觸發器的啟動;
expect包含的子命令:
exp_continue:表示繼續執行expect流,並默認重置超時時鍾;
-continue_timer 不重置超時時鍾,繼續計時,超時則忽略,不推薦;
exp_send : 是send的別名,完全相同的用法;(所有exp_command都是command的別名,完全等同)
spawn 啟動新的子進程;每個spawn都有一個spawn_id
interact 保持交互狀態,默認spawn啟動子進程執行目標命令,並且控制權會在執行命令結束后交還給原來的進程(即用戶可以輸入了!),
通過interact幫助維持子進程的交互,這個操作在ssh時很重要;又比如ftp交互完成傳輸一個文件后,可以通過interact,使得用戶仍停留在ftp的CLI。
exec COMMAND 用於支持bash命令。默認expect不支持bash命令。
close 主動斷開和當前進程的連接(主要取消計時機制,提高效率),而不是默認地從交互窗口中讀取EOF來中斷;
exit 退出expect腳本的命令,可以通過exit執行一些收尾工作:
exit -onexit{
exec rm /tmp/a
}
其中-onexit選項是必須的,是后面的參數執行后,再推出expect命令。
三、使用案例:
A主機免密登錄B主機(B主機IP:192.168.0.2 用戶名:root 密碼:123456):
選擇直接用expect來寫腳本auto_ssh.exp:
#!/usr/bin/expect
set timeout 10
# 注意:expect不支持同一行內的注釋信息出現,只能換行注釋
set password [lindex $argv 0]
# 取腳本后的第一個參數作為密碼,因此使用格式為: ./auto_ssh.exp 123456
spawn ssh root@192.168.0.2
expect "password:"
send "$password\r"
interact
以上簡單地實現免密登錄主機B。