Ssh
Expect 無法辨識 Cisco 路由器上的輸出
我正在編寫一個腳本
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]?
現在有兩個選擇:
- 該文件不存在並被複製到
flash:
- 文件存在,腳本跳過這部分。
如果文件已經存在,它看起來像這樣:
%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 會話正常結束