python下能支持telnet的模塊telnetlib是內(nèi)置模塊,直接import就可以了,其基本的使用方法也是比較簡單的。
[python]view plaincopy
#encoding=utf-8??
def?do_telnet(Host,?username,?password,?finish,?commands):??
import?telnetlib??
'''''Telnet遠程登錄:Windows客戶端連接Linux服務(wù)器'''??
#?連接Telnet服務(wù)器??
tn?=?telnetlib.Telnet(Host,?port=23,?timeout=10)??
tn.set_debuglevel(2)??
#?輸入登錄用戶名??
tn.read_until('login:?')??
tn.write(username?+'\n')??
#?輸入登錄密碼??
tn.read_until('password:?')??
tn.write(password?+'\n')??
#?登錄完畢后執(zhí)行命令??
????tn.read_until(finish)??
for?commandin?commands:??
tn.write('%s\n'?%?command)??
#執(zhí)行完畢后,終止Telnet連接(或輸入exit退出)??
????tn.read_until(finish)??
tn.close()#?tn.write('exit\n')??
if?__name__=='__main__':??
#?配置選項??
Host?='10.255.254.205'#?Telnet服務(wù)器IP??
username?='administrator'#?登錄用戶名??
password?='dell1950'#?登錄密碼??
finish?=':~$?'#?命令提示符??
commands?=?['echo?"test"']??
????do_telnet(Host,?username,?password,?finish,?commands)??
其中port和timeout是可選的參數(shù),而timeout的只是在初始化socket連接時起作用,而一旦連接成功后如果出現(xiàn)等待那就不會起作用了,比如使用read_until方式獲取內(nèi)容時返回的內(nèi)容與指定的內(nèi)容沒有吻合,那么就會造成提示等待的情況,這時timeout是不會起作用的,而這個socket連接會一直保持著,永生不死。
那么如何解決這個問題呢,其實還有一種比較原始的方法,就是使用sleep方法來代替read_until方法,這樣就不會出現(xiàn)種情況,因為到點就會自己輸入,最多也就是最后得不到想要的結(jié)果,但是這個方式很不穩(wěn)定,兼容性也不好;另一種方法是使用線程來啟動這個函數(shù),然后對子線程進行超時設(shè)置,這樣就可以達到間接控制這個telnet連接的目的了。
[python]view plaincopy
import?threading??
pars?=?replace_db_keyworlds(vars_dict,?pars)??
configs?=?pars.split(r'@')??
host?=?configs[0].encode()??
user?=?configs[1]??
passwd?=?configs[2]??
finish?=?configs[3]??
commands?=?configs[4].split(r'\n')??
th1?=?threading.Thread(target=do_telnet,?args=(host.encode('utf-8'),?user.encode('utf-8'),?passwd.encode('utf-8'),?finish.encode('utf-8'),?commands))??
th1.start()??
th1.join(20)##20秒超時時間??
還有一個需要注意的是,傳遞給Telnet方法的字符串都會被解一次碼,所以如果你傳遞過去需要write的字符串是已經(jīng)解碼的unicode的話,那么就會報錯的,所以在傳遞發(fā)送的字符串之前還是先編成utf-8為妥,