2014-11-04 45 views
0

我使用下面的原始代碼來初始化連接到設備,運行一些命令並將值存儲到變量'op'以便我可以解析它,但看起來就像事實上儘管commad遠程執行變量op沒有設置。我也嘗試打印expcet緩衝區的值,但它沒有命令o/p的值。這裏出了什麼問題?通過ssh捕獲輸出爲一個變量用於運行命令

spawn /usr/bin/ssh [email protected][lindex $argv 0] 
    expect { 
     -re ".*Are.*.*yes.*no.*" { 
     send "yes\n" 
     exp_continue 
     #look for the password prompt 
     } 

     "*?assword:*" { 
     send "$password\r" 
     expect "#" 
     send "\n" 
     } 

    } 

    set op [split [send "$cmd\r"]] 
    set op $expect_out(buffer); 

回答

0

問題是因爲下面的代碼。

set op [split [send "$cmd\r"]]; # 'send' command won't return the 'cmd' output. 

發送命令後,你必須給下一expect語句,則只能期待將等待它反過來會被保存到expect_out(buffer)

你要發送命令並等待提示如下。

send "$cmd\r" 
expect "#" 
puts $expect_out(buffer); #Will print the output of the 'cmd' output now. 
set op [ split $expect_out(buffer) ] 

這是因爲沒有send後,多了一個expect,我們將錯過了什麼衍生的SSH會話expect正在發生的事情會認爲你只需要發送一個字符串值,而不是從期待別的會話。

請記住,使用split而沒有任何第二個參數會導致輸出分裂white-space

執行該命令後要等待的單詞可能因您的系統而異。它可以是#$>:;所以,確保你給出了正確的一個。或者,您可以在發送指令後使用expect提供對提示的廣義化這樣

set prompt "#|>|:|\\\$"; # We escaped the `$` symbol with backslash to match literal '$' 

,它可以被用來作爲

expect -re $prompt; #Using regex to match the pattern 

更新:

也許,#的匹配已經在預期緩衝區中可用,從而導致出現這個問題。爲了避免這種情況,您可以在發送命令之前嘗試在代碼中添加以下行。

expect * 
send "$cmd\r" 
expect "#" 
puts $expect_out(buffer); #This should have the output of the command executed. 

在這裏,*匹配任何東西。這就像是說:「我不在乎輸入緩衝區中的 ,把它扔掉。」如果沒有任何內容,這種模式總是匹配,即使是 。請記住*匹配任何內容,並且空的 字符串就是任何東西!作爲這種行爲的必然結果,該命令 總是立即返回。它從不等待新數據到達。它不需要,因爲它匹配所有的東西。

+0

仍然不起作用,expect_out緩衝區似乎沒有整個輸出。我嘗試將matc_max設置爲100000,但無濟於事。 – Zuckerberg 2014-11-05 20:55:11