python中telnetlib模塊的使用


python下能支持telnet的模塊telnetlib是內置模塊,直接import就可以了,其基本的使用方法也是比較簡單的。

 

[python]  view plain  copy
 
  1. #encoding=utf-8  
  2.   
  3. def do_telnet(Host, username, password, finish, commands):  
  4.     import telnetlib  
  5.     '''''Telnet遠程登錄:Windows客戶端連接Linux服務器'''  
  6.    
  7.     # 連接Telnet服務器  
  8.     tn = telnetlib.Telnet(Host, port=23, timeout=10)  
  9.     tn.set_debuglevel(2)  
  10.        
  11.     # 輸入登錄用戶名  
  12.     tn.read_until('login: ')  
  13.     tn.write(username + '\n')  
  14.       
  15.     # 輸入登錄密碼  
  16.     tn.read_until('password: ')  
  17.     tn.write(password + '\n')  
  18.         
  19.     # 登錄完畢后執行命令  
  20.     tn.read_until(finish)  
  21.     for command in commands:  
  22.         tn.write('%s\n' % command)  
  23.       
  24.     #執行完畢后,終止Telnet連接(或輸入exit退出)  
  25.     tn.read_until(finish)  
  26.     tn.close() # tn.write('exit\n')  
  27.   
  28. if __name__=='__main__':  
  29.      # 配置選項  
  30.     Host = '10.255.254.205' # Telnet服務器IP  
  31.     username = 'administrator'   # 登錄用戶名  
  32.     password = 'dell1950'  # 登錄密碼  
  33.     finish = ':~$ '      # 命令提示符  
  34.     commands = ['echo "test"']  
  35.     do_telnet(Host, username, password, finish, commands)  

其中port和timeout是可選的參數,而timeout的只是在初始化socket連接時起作用,而一旦連接成功后如果出現等待那就不會起作用了,比如使用read_until方式獲取內容時返回的內容與指定的內容沒有吻合,那么就會造成提示等待的情況,這時timeout是不會起作用的,而這個socket連接會一直保持着,永生不死。

 

那么如何解決這個問題呢,其實還有一種比較原始的方法,就是使用sleep方法來代替read_until方法,這樣就不會出現種情況,因為到點就會自己輸入,最多也就是最后得不到想要的結果,但是這個方式很不穩定,兼容性也不好;另一種方法是使用線程來啟動這個函數,然后對子線程進行超時設置,這樣就可以達到間接控制這個telnet連接的目的了。

 

[python]  view plain  copy
 
  1. import threading  
  2. pars = replace_db_keyworlds(vars_dict, pars)  
  3. configs = pars.split(r'@')  
  4. host = configs[0].encode()  
  5. user = configs[1]  
  6. passwd = configs[2]  
  7. finish = configs[3]  
  8. commands = configs[4].split(r'\n')  
  9. th1 = threading.Thread(target=do_telnet, args=(host.encode('utf-8'), user.encode('utf-8'), passwd.encode('utf-8'), finish.encode('utf-8'), commands))  
  10. th1.start()  
  11. th1.join(20)  ##20秒超時時間  


還有一個需要注意的是,傳遞給Telnet方法的字符串都會被解一次碼,所以如果你傳遞過去需要write的字符串是已經解碼的unicode的話,那么就會報錯的,所以在傳遞發送的字符串之前還是先編成utf-8為妥,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM