2014-09-22 351 views
1

有人可以幫助理解終端窗口中的打印是如何工作的嗎? 下面是測試腳本如何在終端窗口(Python)中打印/顯示telnet會話的輸出

test_script.py

import telnetlib 
HOST = "10.1.1.151" 
tn = telnetlib.Telnet(HOST) 
tn.open(HOST) 
test_var = ["test"] 
print test_var 
tn_read = tn.read_very_eager() 
print tn_read 

輸出腳本時,從終端上運行:

$ python test_script.py 
    ['test'] 

tn_read應該是這樣的「用戶名:」但它不是打印在終端窗口中。

如果我從解釋我得到了預期運行它:

>>> tn.read_very_eager() 
'\n\rUser Name : ' 

爲什麼還是需要做有當腳本從終端叫下面的輸出是什麼?

$ python test_script.py 
    ['test'] 
    User Name : 
+1

中的值爲「\ r」是否存在等使我不知道它是否使用.lstrip()的變量tn_read值得:即打印tn_read.lstrip()使事情變得更好。 – 2014-09-22 07:45:30

+0

@Tony:不,它沒有任何區別。 – flamenco 2014-09-22 07:49:21

+0

@flamenco也許看看文檔中是否有其他函數,比如'tn.read_not_so_eager()'(只是一個例子),或者'tn.read()'。 – PascalVKooten 2014-09-22 07:52:12

回答

5

簡短的回答是使用read_until()超時。例如

timeout = 3 # seconds 
tn_read = tn.read_until('User Name :', timeout) 
print repr(tn_read) 

長的答案如下。

read_very_eager()是非阻塞的,它將返回任何可用的已煮熟數據,但沒有任何數據。如果在建立連接後過早調用非阻塞「讀」方法,則可能沒有要讀取的數據,並且read_very_eager()將返回空字符串 - ''

所以你的問題可能與時間有關;讀取是非阻塞的,並且不能返回尚未被接收,處理和緩衝的數據。當您通過終端進行交互時,需要一段時間才能輸入命令,因此您不會注意到計時問題,但是從腳本運行時,人爲延遲將被刪除,並且計時問題會變得明顯。嘗試調用read方法睡前:

import telnetlib 
import time 

HOST = "10.1.1.151" 
tn = telnetlib.Telnet(HOST) 
test_var = ["test"] 
print test_var 
time.sleep(5) 
tn_read = tn.read_very_eager() 
print repr(tn_read) 

運行上面的腳本,你可能看到您的預計產量....話又說回來,你可能不會。相反,你仍然可能會看到:

['test'] 
'' 

可能有其他的因素太多,尤其是服務器可以用遠程登錄IAC序列響應。如果在您撥打read_very_eager()(實際上是任何讀取功能)之前已經到達,則該消息將會消耗該序列。在這種情況下read_very_eager()也返回一個空字符串。

如果你想看到什麼正在通過連接交換,你可以調用​​:

進口telnetlib

tn = telnetlib.Telnet('library.cedarville.edu') # any old server will do 
tn.set_debuglevel(1) 
tn_read = tn.read_all() 
print repr(tn_read) 

典型輸出是:

Telnet(library.cedarville.edu,23): recv '\xff\xfd\x03' 
Telnet(library.cedarville.edu,23): IAC DO 3 
Telnet(library.cedarville.edu,23): recv '\xff\xfb\x03\xff\xfb\x01\xff\xfd\x18\xff\xfd#\xff\xfd$\xff\xfd\x1f' 
Telnet(library.cedarville.edu,23): IAC WILL 3 
Telnet(library.cedarville.edu,23): IAC WILL 1 
Telnet(library.cedarville.edu,23): IAC DO 24 
Telnet(library.cedarville.edu,23): IAC DO 35 
Telnet(library.cedarville.edu,23): IAC DO 36 
Telnet(library.cedarville.edu,23): IAC DO 31 
Telnet(library.cedarville.edu,23): recv '\r\n' 
Telnet(library.cedarville.edu,23): recv 'login: ' 

另一個「閱讀「功能,則應該使用read_until()。如果您不想無限期地阻止,請按上圖所示傳遞超時。

+0

使用'read_very_eager'時它與時間有關!你救了我! – tarabyte 2017-10-10 23:59:35

1

telnet會話的網絡設備的一個終端上的示例:

HOST = "1.1.1.1" 
PORT = 30001 
TIMEOUT = 3 
PASSWD = "cisco" 
COMMANDS = ["term len 0","show version","show ip route","show run","!!!end!!!"] 

import telnetlib 

tn = telnetlib.Telnet(HOST, PORT, TIMEOUT) 
#tn.set_debuglevel(1) 
tn.write("\r\n\r\n") 
for cmd in COMMANDS: 
    tn.write(cmd+"\r\n") 

print tn.read_until("!!!end!!!\r\n",3) 
tn.close()