2010-09-11 50 views
0
import telnetlib 

def telNetCall(): 
    host = "10.200.1.23" 
    user = "me" 
    password = "matrix" 
    telnet = telnetlib.Telnet(host) 
    telnet.read_until('Username: ', 3) 
    telnet.write(user + '\r') 
    telnet.read_until('Password: ', 3) 
    telnet.write(password + '\r') 
    telnet.write("sh log"+ "\r\n") 
    telnet.write('exit' + '\r') 
    print telnet.read_all() 

我的問題是,當我試圖抓住從cisco路由器「顯示日誌」,它給了我只是部分結果,我的事情那是因爲你需要點擊空格鍵5次(取決於日誌歷史記錄的時間)以獲得完整日誌 - 當我手動執行時,我不知道如何告訴python列出完整日誌。任何建議?的Python - 路由器和表滿結果的telnet(打空格鍵)

+0

Send speacebars? – Robus 2010-09-11 10:32:48

+0

你是什麼意思?例? – Whit3H0rse 2010-09-11 10:44:29

回答

5

不是一個解決辦法,但似乎是一個合理的解決方法:

您可以通過發出以下IOS CLI命令禁用終端的尋呼。

終端長度0

+0

這是一個很好的解決方法:) Tx – Whit3H0rse 2010-09-11 12:30:00

3

它實際上是確切的答案.....你必須輸入端長度爲0或路由器頁面,如使用unix「更多」的輸出,使得它的人類可讀並且不只是通過滾動快速

import telnetlib 

def telNetCall(): 
    host = "10.200.1.23" 
    user = "me" 
    password = "matrix" 
    telnet = telnetlib.Telnet(host) 
    telnet.read_until('Username: ', 3) 
    telnet.write(user + '\r') 
    telnet.read_until('Password: ', 3) 
    telnet.write(password + '\r') 

    telnet.write("term length 0"+ "\r\n") 

    telnet.write("sh log"+ "\r\n") 
    telnet.write('exit' + '\r') 
    print telnet.read_all() 
3

的問題就變成如何捕捉超過了20K更大的輸出...記錄到文件我得到的所有輸出,但我只想要保存選擇性輸出時,不整個會議。當使用child.after輸出被截斷後,例如開始丟失,這可以通過增加maxread來緩解,但當接近30-40kb的輸出時它仍然彈出。對於那些想知道的,我使用「sh int | i protocol | Last」來獲取思科交換機的輸出,每個接口只返回3行,但我的客戶的一些交換機堆棧有450個端口。

不確定這裏的動態是什麼,但對於一些交換機來說它確實成功。

有一段時間我試着通過選擇性地將日誌記錄打開和關閉來解決問題。這被證明是不可靠的,從通用日誌記錄中我可以看到pexpect在日誌記錄看到之前匹配輸出方式。當數據仍在寫入文件時,我最終禁用了日誌記錄。在大約10行輸出後截斷輸出。

所以最終的問題仍然存在,那麼如何增加child.after的可靠性。爲了捕捉大量的輸出。只要產出是可靠的,我對於增加期望報表超時沒有任何問題。我現在看到的是沒有輸出不完整的超時。

child.sendline(action) 
child.expect(prompt_keys) 
action_output = str(child.after) # Captures the output 
# print action_output # Uncomment for debugging grabbed output 
output_file.write(action_output + "\n\n\n") # Write the output to file