簡短的回答是使用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()
。如果您不想無限期地阻止,請按上圖所示傳遞超時。
中的值爲「\ r」是否存在等使我不知道它是否使用.lstrip()的變量tn_read值得:即打印tn_read.lstrip()使事情變得更好。 – 2014-09-22 07:45:30
@Tony:不,它沒有任何區別。 – flamenco 2014-09-22 07:49:21
@flamenco也許看看文檔中是否有其他函數,比如'tn.read_not_so_eager()'(只是一個例子),或者'tn.read()'。 – PascalVKooten 2014-09-22 07:52:12