expect一般用於實現用腳本來自動遠程登錄,對遠程機器執行相關操作
測試機上的expect目錄一般在/usr/bin/expect路徑
下面是從網上查詢的用法總結:
1. expect中的判斷語句:
expect中沒有小括號(),所有的if/else, while, for的條件全部使用大括號{}, 並且{ 與左邊要有空格,否則會報錯。另,else 不能單獨占一行,否則會報錯。
2. 字符串比較
對比string,使用==表示相等, !=標示不相等。
3. switch 語句
記得左大括號{ 的左邊要有空格,否則會報錯
4. 讀取用戶輸入
expect_user -re 表示正則表達式匹配用戶按下回車前輸入的所有字符
expect_out(1, string) 表示第一個匹配的內容,即回車前所有字符
expect_out(buffer) 所有的buffer內容
5. break && continue
如c中一樣,expect一樣可以使用break && continue, 並且功能相同。注:只能用在循環中。
6. 定義交互命令
- if { condition } {
- # do your things
- } elseif {
- # do your things
- } else {
- # do your things
- }
2. 字符串比較
- if { "$node" == "apple" } {
- puts "apple"
- } elseif { "$node" == "other" } {
- puts "invalid name"
- exit 70
- } else {
- puts "asd"
- }
3. switch 語句
- switch $location {
- "apple" { puts "apple" }
- "banana" { puts "banana" }
- default {
- puts "other"
- }
- }
4. 讀取用戶輸入
- expect_user -re "(.*)\n"
- send_user "$expect_out(1, string)\n"
expect_out(1, string) 表示第一個匹配的內容,即回車前所有字符
expect_out(buffer) 所有的buffer內容
5. break && continue
如c中一樣,expect一樣可以使用break && continue, 並且功能相同。注:只能用在循環中。
6. 定義交互命令
- # stick control + z in variable
- set ControlZ \032
- # stick control + c in variable
- set ControlC \x03
- # define string embedded ctrl-z && tab
- set oddword foo\032bar\tgorp
7. { }大括號:保留所有字符原有的意思,而不做解釋,類似於shell中的單引號
舉例:set var {a$b[set c 3]\tddd} 將{}中的一坨東西直接賦值給var
8. {}的另外一個作用是可以續行,(其實是左大括號)
舉例:
而以下的寫法則是錯誤的:
9. []中括號:執行命令
舉例:
舉例:set var {a$b[set c 3]\tddd} 將{}中的一坨東西直接賦值給var
8. {}的另外一個作用是可以續行,(其實是左大括號)
舉例:
- if {$count < 0} {
- break;
- }
- if {$count < 0}
- {
- break;
- }
舉例:
- set count [expr $count - 1 ]
- set a [set b 0]
10. ()小括號:expect中沒有小括號。所有在C中用的小括號都要換成大括號
11. spawn ssh -l username 192.168.1.1
spawn是進入expect環境后才可以執行的expect內部命令,如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命 令的。所以不要用 “which spawn“之類的命令去找spawn命令。好比windows里的dir就是一個內部命令,這個命令由shell自帶,你無法找到一個 dir.com 或 dir.exe 的可執行文件。
它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。
12. expect "password:"
這里的expect也是expect的一個內部命令,有點暈吧,expect的shell命令和內部命令是一樣的,但不是一個功能,習慣就好了。這個命 令的意思是判斷上次輸出結果里是否包含“password:”的字符串,如果有則立即返回,否則就等待一段時間后返回,這里等待時長就是前面設置的30秒
spawn是進入expect環境后才可以執行的expect內部命令,如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命 令的。所以不要用 “which spawn“之類的命令去找spawn命令。好比windows里的dir就是一個內部命令,這個命令由shell自帶,你無法找到一個 dir.com 或 dir.exe 的可執行文件。
它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。
12. expect "password:"
這里的expect也是expect的一個內部命令,有點暈吧,expect的shell命令和內部命令是一樣的,但不是一個功能,習慣就好了。這個命 令的意思是判斷上次輸出結果里是否包含“password:”的字符串,如果有則立即返回,否則就等待一段時間后返回,這里等待時長就是前面設置的30秒
13. interact
執行完成后保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登錄完成后會退出,而不是留在遠程終端上。如果你只是登錄過去執行