1. 程式人生 > >python中telnetlib模塊的使用

python中telnetlib模塊的使用

ber lib ace 但是 內置模塊 lds ack level rgs

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

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

python中telnetlib模塊的使用