shell 中的expect 用法


expect一般用於實現用腳本來自動遠程登錄,對遠程機器執行相關操作

測試機上的expect目錄一般在/usr/bin/expect路徑

下面是從網上查詢的用法總結:

1. expect中的判斷語句:     
  1. if { condition } {
  2.      # do your things
  3. } elseif {
  4.      # do your things
  5. } else {
  6.      # do your things
  7. }
expect中沒有小括號(),所有的if/else, while, for的條件全部使用大括號{}, 並且{ 與左邊要有空格,否則會報錯。另,else 不能單獨占一行,否則會報錯。
2. 字符串比較
  1. if { "$node" == "apple" } {
  2.      puts "apple"
  3. } elseif { "$node" == "other" } {
  4.      puts "invalid name"
  5.      exit 70
  6. } else {
  7.      puts "asd"
  8. }
對比string,使用==表示相等, !=標示不相等。
3. switch 語句
  1. switch $location {
  2.     "apple" { puts "apple" }
  3.     "banana" { puts "banana" }
  4.     default {
  5.         puts "other"
  6.      }
  7. }
記得左大括號{ 的左邊要有空格,否則會報錯
4. 讀取用戶輸入
  1. expect_user -re "(.*)\n"
  2. send_user "$expect_out(1, string)\n"
expect_user -re 表示正則表達式匹配用戶按下回車前輸入的所有字符
expect_out(1, string) 表示第一個匹配的內容,即回車前所有字符
expect_out(buffer) 所有的buffer內容
5. break && continue
如c中一樣,expect一樣可以使用break && continue, 並且功能相同。注:只能用在循環中。
6. 定義交互命令
  1. # stick control + z in variable
  2. set ControlZ \032
  3. # stick control + c in variable
  4. set ControlC \x03
  5. # define string embedded ctrl-z && tab
  6. set oddword foo\032bar\tgorp

7. { }大括號:保留所有字符原有的意思,而不做解釋,類似於shell中的單引號
舉例:set var {a$b[set c 3]\tddd} 將{}中的一坨東西直接賦值給var
8. {}的另外一個作用是可以續行,(其實是左大括號)
舉例:
  1. if {$count < 0} {
  2.    break;
  3. }
而以下的寫法則是錯誤的:
  1. if {$count < 0} 
  2. {
  3.    break;
  4. }
9. []中括號:執行命令
舉例:
  1. set count [expr $count - 1 ]
  2. 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秒

13. interact
  執行完成后保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登錄完成后會退出,而不是留在遠程終端上。如果你只是登錄過去執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM