2014-11-05 32 views
1

希望你一切安好!預期腳本 - 從某個點開始記錄,並在某個點停止

我最近已經開始爲我們的一些網絡工程師使用一些小工具。它的功能是檢索電路信息,然後解析並輸出一個很好的格式。當然,其中一部分涉及SSH連接到所需的盒子並運行命令以生成所需的輸出。

這是我目前得到的腳本。它工作正常,運行所需的命令,發送一些空格來提示系統顯示更多電路,然後通過退出完成。所有這些都被記錄到一個名稱與該主機名相同的文件中。大。

但是,當我讀取生成的文件並看到它包含大量數據時,包括我運行的命令和連接上提供的不必要的統計數據,我的問題就很明顯。我只是在發出命令時纔開始尋找記錄,並在之後切斷記錄。由於我不熟悉期望,我非常感謝任何指導。

PS。道歉,如果我做了什麼愚蠢的事情;我對這門語言本身相當陌生,而且那裏的支持也不是那麼好。

謝謝。

set ip [lindex $argv 0] 
set hostname [lindex $argv 1] 
set timeout 10 
set user "" 
set password "" 

# Spawning the ssh session 
spawn ssh $ip -l $user 

# Awaiting prompt for password 
expect "[email protected]$ip's password:" 
sleep 1; 
# Awaiting prompt 
send "$password\n" 
sleep 2 
log_file -noappend $hostname; 
send "terminal length 0\n" 
sleep 1 
send "show int desc\n" 
sleep 5 
send "exit\n" 
interact 
exit 
+0

在每個'send'命令後添加'expect'語句,如果絕對必要的話使用'sleep'。說,它有所有輸出,你的意思是記錄從ssh登錄本身的開始開始? – Dinesh 2014-11-05 14:16:04

回答

1

您可以通過將log_file放置在您想要的位置來控制輸出。

當你要開始記錄,您可以添加行(你已經在你的代碼)

log_file my_log_file.log 

無論在控制檯打印將這些命令執行後,登錄到一個叫做my_log_file.log文件。默認情況下,如果文件已經存在於該位置,它將被追加。如果您添加標記-noappend,那麼它將覆蓋現有文件。

log_file -noappend fresh.log 

如果要停止日誌記錄,那麼只需給LOG_FILE不帶任何參數這樣

log_file 

從這一點來說,無論生成的輸出不會被保存。

例如,要登錄到一些開關和給予一定的憑據,並執行一些命令可以像如下,

spawn ssh some_ip 
expect some_thing 
#Login code here 
log_file output.log; # Start logging 
#some actions here 
log_file; # stopping logging here. 
# some more actions 
# end 

您發送的空間多次。相反,您可以將終端長度設置爲0,如下所示:

send "term len 0" 
expect "prompt" 

這樣可以避免發送多次的開銷。此外,在你的情況下,空間將很快發送到交換機,因爲沒有什麼可期待的。如果你仍然有興趣做纔不至於「一詞LEN 0」,那麼至少你可以把代碼在一個循環中,像下面這樣

for { set i 0 } { $i < 10 } { incr i } { 
    send " " 
    expect "something" 
} 

但是,這樣做的方式是不可取的,因爲是需要發送超過10個空間的可能性,那麼這將失敗。

+0

不幸的是,看起來您的建議是在命令之前創建日誌文件,因此它開始記錄日誌並不起作用。相反,劇本似乎直接從蝙蝠記錄下來,記錄下所有內容。也許這是全部存儲,然後傾倒一分鐘我說日誌文件的名稱? – Hugh 2014-11-05 11:01:35

+0

想知道爲什麼。你可以在你的問題中粘貼當前代碼並刪除舊代碼? – Dinesh 2014-11-05 11:09:37

+0

嗨Dinesh。我將在接下來的20分鐘內這樣做。 – Hugh 2014-11-05 12:23:33

0

我大概晚了這裏,但如果要求是你期望的腳本只有特定的部分記錄到日誌文件,然後使用

log_file <log file name> 

開始之後

<expect script statements here> 

記錄並在此處停止記錄,只需寫入:

log_file 

此後可能會出現更多期望語句秒。