2010-12-14 81 views
0

我試圖用python3自動執行一些telnet操作。所以我開始在telnetlib中使用build(而不是pexpect)。telnetlib read_until()函數混淆

其實一切工作到目前爲止,但我不完全瞭解如何read_until的工作 - 實際上文檔說,你可以設置一個超時,如果沒有找到搜索字符串超時發回一個空字節值,或者如果有另一個值可以存儲爲返回值!

這有道理嗎?!

如果我想read_until某個值 - 我怎麼知道這個值是真正的函數讀取的。此外,我無法找到如何檢查超時是否被擊中。

我現在的解決方法是:

output = telnet.read_until(str.encode(hostname), 3) 
if re.search(hostname, bytes.decode(output), re.IGNORECASE): 
    #do something when the output matches the searchstring 
else: 
    #stop the function 

但是這並沒有任何意義對我來說,也許你們現在是更好的解決方案

回答

1

是的,如果你的主機名是example.com,read_until將返回類似weijwrgnerg hgqwv blather example.com。除非它在三秒鐘後還沒有找到主機名,否則它只會吐出當前得到的信息:weijwrgnerg hg

所以我認爲你做的事情幾乎是正確的。您可能需要re.escape您的主機名,否則它會將其解釋爲正則表達式。或者,您可以使用Python的.endswith()。你可以做output.decode()來得到一個字符串(而不是bytes.decode(output))。

+0

感謝您的快速回復! 我現在做unistand如何read_until的工作 - stil它沒有多少意義,爲什麼它是這樣實現的,但可以!
我改寫了我的實現我們: 輸出= telnet.read_until(hostname.encode(),3) 如果re.search(re.escape(主機名),output.decode(),旗幟= re.IGNORECASE ): 提出的另一個問題 - 是不是有必要定義hostname.encode('ascii')或類似的東西? like telnet.write(password.encode('ascii')+ b「\ n」) – herbert 2010-12-15 11:05:38

+0

@Herbert:不客氣。如果你使用編碼或解碼而不指定編解碼器,它將使用系統默認的('sys.getdefaultencoding()'),它在Python 2中是ascii,在Python 3中是utf-8。 – 2010-12-15 11:14:00

+0

好,我正在使用python 3它是UFT-8,我希望支持 - 希望telnet實現在不同的客戶端上也支持UTF-8 :) – herbert 2010-12-15 11:31:27