2010-01-16 517 views
3

我是通過在Linux服務器上編寫一個Expect腳本的中途,該服務器應該遠程登錄到路由器以收集一些系統信息。到目前爲止,我的腳本可以成功建立連接,運行路由器命令,斷開連接並終止。如何在Expect中保存和解析命令輸出?

該命令顯示了我需要解析的幾行文字,這是我不確定如何在Expect中執行的操作。如何保存輸出,grep一行,然後保存行中的一列,最後將結果保存到文件中?如果可能的話,我希望完全使用Expect而不是解決方法(例如Expect嵌入在Bash中)。

謝謝你的時間。 jk04

+0

你能告訴我們一些示例輸出嗎? – 2010-01-16 20:59:26

+0

http://meta.stackexchange.com/questions/4481/apply-markup-code-in-comments – 2010-01-18 07:50:36

回答

6

基本上,$ expect_out(buffer)[1]。將最後一次預期匹配的輸出保持爲當前輸出。你可以在那裏找到你的命令輸出。

對於字符串操作,您可以簡單地使用tcl的內置[2] [3]。

  1. 「如何訪問遠程命令的結果期望」 http://wiki.tcl.tk/2958
  2. 「正則表達式」 http://wiki.tcl.tk/986
  3. 「字符串匹配」 http://wiki.tcl.tk/4385
+0

我認爲$ expect_out(緩衝區)只包含您的模式匹配的文本,而不是所有來自上次預期匹配的文本匹配目前的一個。 – 2010-01-16 23:21:37

+0

我認爲不,你可以檢查關於「expect_out(緩衝區)有前一個發送內容」的討論,http://wiki.tcl.tk/17378 – 2010-01-17 01:05:54

+0

我應該說是嗎?因爲當前模式匹配的文本是最後一次期望輸出的文本:) – 2010-01-17 01:18:55

6

兩個技巧預計發展:

  • autoexpect爲您的自動化佈局框架
  • exp_internal 1可以詳細地顯示期望在內部做什麼。當你無法弄清楚爲什麼你的正則表達式不能捕捉你期望的東西時,這是不可或缺的。
+1

** exp_internal 1 ** aversome! – gavenkoa 2011-09-14 14:43:01

3

我遇到並解決了與bash交互的類似問題。我相信這種方法可以推廣到任何其他交互式環境,它提供無操作,固定字符串輸出。

基本上,我用兩個固定字符串包裝命令,然後在開始和結束時搜索包含這些字符串的模式,並將內容保存在它們之間。例如:

set var ""; 
expect $prompt { send "echo PSTART; $command; echo PEND;\r"; } 
expect { 
    -re PSTART\r\n(.*)PEND\r\n$prompt { set var [ string trim $expect_out(1,string) ]; send "\r"; } 
    -re $prompt { set var "" ; send "\r"; } 
    timeout { send_user "TIMEOUT\n"; exit } 
} 

我懷疑這種方法可以使用shell的註釋字符,或者是一個返回已知輸出的簡單狀態命令。

然後,你可以做任何你需要的'var'的內容。