2013-01-19 33 views
1

我有一個簡單的BASH腳本,我用它發送一個.esh腳本到遠程主機。例如,我知道用戶名和密碼是主機,所以我的腳本執行以下操作:Telnet /發送/期望 - 從遠程主機自動拉日誌

expect login: 
send root\n 
expect Password: 
send abc123\n 
expect "# " 

所以,這將自動登錄我到遠程主機的用戶root與密碼abc123

我現在試圖發送一個bash風格的單行for循環,從一些日誌文件拉動主機上的一些指標,即:

send 'for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done \n' 

然而,這種失敗:

# can't read "i": no such variable 
    while executing 
send 'for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done \n' 

我讀過一些類似的帖子,但我還沒有發現任何類似的情況。一旦我想出瞭如何實現這一點,我可能會包含更多的命令行命令來優化日誌文件的輸出(即:更多bash臨時變量,通過awk管道輸出等)。

任何人都可以幫我解決這個問題嗎?

謝謝。


編輯:按照所提供的答案,我改變了我的腳本爲以下,和它的工作就像一個魅力:

expect login: 
send root\n 
expect Password: 
send abc123\n 
expect "# " 
send { for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done } 
send "\n" 
send exit 

此登錄到遠程主機,打印出一些有價值的指標到控制檯,然後退出telnet。我現在可以在本地主機上使用bash腳本,通過包含主機名/ IP列表的文本文件循環訪問多個遠程主機。

謝謝!

+1

從技術上講,你應該用'\ r'而不是'\ n'發送 - '\ r'是回車,即.e. 「打入」 –

回答

2

單引號不用於引用Tcl,它們是正常字符。如果您需要反斜槓,命令和變量擴展,請使用雙引號,如果不需要,請使用大括號。

將第一個'替換爲{,最後一個替換爲}