Ssh

Expect 無法辨識 Cisco 路由器上的輸出

  • July 19, 2017

我正在編寫一個腳本expect來自動配置 cisco 路由器ssh。該腳本的一部分是將圖像複製到其中(flash如果它不存在):

為此,期望發送一個copy並等待Destination filename然後發送一個return

cisco#copy tftp://10.xx.xx.3/name_of_image.bin flash:
Destination filename [name_of_image.bin]?

現在有兩個選擇:

  1. 該文件不存在並被複製到flash:
  2. 文件存在,腳本跳過這部分。

如果文件已經存在,它看起來像這樣:

%Warning:There is a file already existing with this name
Do you want to over write? [confirm]

現在我的問題是:腳本等待Do you want to over write? [confirm]然後應該退出,因為圖像已經在快閃記憶體中。但目前它似乎expect無法辨識那條線並卡在確認中。它已經嘗試了幾種模式,例如, [confirm],*[confirm]*等等。Do``*write*

我的那項工作的程式碼目前看起來像這樣:

       expect "*#"
       send "copy tftp://10.$ip_local.3/name_of_image.bin flash:\r"
       expect "Destination filename"
       send "\r"

       expect {
         "Do you want to over write? [confirm]"{
          interact
          abort
       }
       expect "*#"
       send "exit\r"

我究竟做錯了什麼?

有幾點不對:

  • 在雙引號字元串[confirm]中將嘗試呼叫期望命令“確認”——期望中的方括號就像 shell 中的反引號
  • expect 需要有由空格分隔的參數。因此,在左花括號之前放置一個空格至關重要
  • 您的腳本不期望有條件地覆蓋提示。您需要使用expect命令的多模式形式,其中第一個匹配的獲勝。

試試這個:

expect {
   -exact {Do you want to over write? [confirm]} {
       send "\r"
       exp_continue
   }
   "*#"
}
send "exit\r"
expect eof

筆記

  • 我正在使用“精確”匹配,因為您有全域萬用字元?並且[...]會干擾。
  • 我正在使用期望的無插值引號(大括號)來防止[confirm]嘗試命令替換
  • 我希望覆蓋提示或**命令提示
  • exp_continue如果出現覆蓋提示,我會一直保留在這個期望命令中。這意味著我仍然可以查找命令提示符。
  • 以上2個項目符號是如何實現條件匹配。
  • 我假設您只想在覆蓋提示下按 Enter 鍵。
  • 在你之後exit,等待eof讓 ssh 會話正常結束

引用自:https://serverfault.com/questions/863047