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


Posted in Python onApril 16, 2021

最近在学习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

输出如下:

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

注:我这边测试的目标主机是嵌入式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自动连接检测密码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
Python分析学校四六级过关情况
Nov 22 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
python如何去除字符串中不想要的字符
Jul 05 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
python实现数据导出到excel的示例--普通格式
May 03 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
python 多线程共享全局变量的优劣
Sep 24 Python
如何利用pygame实现打飞机小游戏
May 30 Python
AI:如何训练机器学习的模型
python 用递归实现通用爬虫解析器
MATLAB 如何求取离散点的曲率最大值
用Python远程登陆服务器的步骤
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 #Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 #Python
python中print格式化输出的问题
Apr 16 #Python
You might like
phpmyadmin操作流程
2006/10/09 PHP
建立文件交换功能的脚本(一)
2006/10/09 PHP
删除数组元素实用的PHP数组函数
2008/08/18 PHP
PHP函数常用用法小结
2010/02/08 PHP
php获取excel文件数据
2017/04/21 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
Python 内置函数complex详解
2016/10/23 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
中学教师实习自我鉴定
2013/09/28 职场文书
教育孩子心得体会
2014/01/01 职场文书
小学语文课后反思精选
2014/04/25 职场文书
广告学专业求职信
2014/06/19 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis