2011-07-22 98 views
3

read_all()「從cisco設備讀取數據。 有時它讀取數據,有時它不會讀取並給出空字符串。 我嘗試了下面的2個命令但它仍然不是consitently讀取數據在python中使用tn.read_all()讀取數據

data=tn.read_until("exit") 
data= tn.read_all() 

請給一些投入我是新來的Python

代碼我使用:。

_command2='show chassis' 
    print 'Commands issued............' 
    #ISSUE COMMANDS VIA TELNET  
    tn.write("term len 0\r") 
    #tn.read_until(" ")  
    #tn.write(_command1+"\r") 
    tn.write(_command2+"\r") 
    tn.write("exit\r") 
    print 'Read telnet data............' 
    #READ TELNET DATA 
    #data=tn.read_eager() 
    data=tn.read_until("exit") 
    #data= tn.read_all() 
    #print data 
    print 'Telnet data read successfully............' 
+0

你怎麼'tn'? –

+0

tn是telnetlib.Telnet對象嗎? –

+0

我正在傳遞函數def data(tn,device,fqdn,device_data,_lookupTableDict,debugging): –

回答

2

我也面臨同樣的problem..This將幫助:

tn = telnetlib.Telnet('64.0.0.1') 
tn.write('ls \r\n') 
data = '' 
while data.find('#') == -1: 
    data = tn.read_very_eager() 
print data 

這段代碼被執行命令後讀取信息。 並顯示'#'提示符。

1

翔RT回答:

使用time.sleep(1)命令

之間write

龍答:

當您的Cisco IOS控制檯上輸入一條命令,它會阻止,直到命令完成。您在命令運行時輸入到控制檯的任何輸入都會傳送到運行命令中,就像STDIN在bash shell中運行一樣。然而,在bash中,如果一個命令沒有顯式讀取輸入,那麼在程序退出時,bash會接收未使用的輸入並將其解釋爲shell命令。所以如果你想要一個接一個地運行兩個命令,第一個命令不能從STDIN中讀取,你可以在第一個命令運行時輸入第二個命令,也就是說,你不必等待第一個命令在你之前完成輸入另一個命令。這種緩衝機制使得telnet腳本變得容易,而且我們越來越期望從成熟的shell中獲得這一點。顯然Cisco IOS缺乏這個功能,所以你必須確保你不要過早地輸入你的命令。有兩種方法我可以想到,去做:

  1. 等待命令之間的固定時間。通常1秒是大多數命令的安全賭注。
  2. 解析每個命令後的輸出,直到找到提示,然後輸入下一個命令,然後再次解析,依此類推。
0

用途:

tn.read_very_eager()

,而不是tn.read_all() - read_all等待,直到連接被關閉