天天看點

python telnetlib詳解 執行循環指令_[轉載][Python學習]使用telnetlib來執行telnet指令

今天想做一個自動登入伺服器執行一些指令,然後上傳一些東西進行部署的東西。看到有一個叫telnetlib的庫可以使用,于是做了一個簡單的小程式來登入到伺服器執行一些指令。代碼如下:

import telnetlib

host['ip']=’127.0.0.1′

host['user']=’test’

host['password']=’test’

host['commands']=['cd lib', 'ls']

def do(host):

tn =

telnetlib.Telnet(host['ip'])

tn.set_debuglevel(2)

tn.read_until("login: ")

tn.write(host['user'] + "n")

tn.read_until("Password: ")

tn.write(host['password'] + "n")

for command

in host['commands']:

tn.write(command+’n’)

tn.write("exitn")

print

tn.read_all()

print

‘Finish!’

上述程式隻是一個示例,并不能真正運作。不過感到使用 Python 的子產品真是太友善了。

但也遇到一些問題,主要就是如何判斷程式執行的結果。telnetlib提供好多方法可以得到資料,象read_until()是當結果中存在想要

的資訊時傳回,read_some()是隻要有結果就傳回,read_very_lazy()是傳回緩沖區中的資料。經過看代碼,telnetlib采用

緩沖的處理方式,是以資料并不是一下子就傳回的,而是先放在了緩沖區中。許多的讀取處理都是圍繞着這個緩沖區來的。而緩沖區的資訊何時到達就不說不清楚

了,也許很快,也許很慢,也許分别到達,也許一下子就收到了。是以,對于資料不一定到齊的這種情況,就采用了象read_until()來判斷緩沖區中的

資料是否有想要的内容,如果沒有就等待,除非到達了逾時時間。再有可以使用expect方法,與read_until差不多,但是它可以支援正規表達式,

功能要強大得多。

在網上還有一個叫 Pexpect

它好象功能強大,它支援多種協定,它的首頁就建議使用 Pexpect 來下載下傳它的文檔。不過因為網絡不太好就沒有下來,不知道支不支援

Telnet 協定。

上面的程式再配以 ftplib

的功能就可以做一個遠端更新的維護程式。隻不過如何判斷背景傳回的資訊,我沒有找到好的方法,是使用read_lazy()還是read_eager()

呢?還是什麼别的方法。最主要的問題是,傳回的資料不一定完整。好象沒有提供一個read_line()的方法。