【python】telnetlib--Telnet客户端使用实践

本文详细介绍了如何使用Python的telnetlib库进行远程主机的Telnet连接,包括实例化、连接、发送指令、读取返回值及退出连接等步骤,并展示了在登陆场景和获取命令结果的应用实例。同时涵盖了常用函数的深入解析。
摘要由CSDN通过智能技术生成

▲写在前面

     最近因为项目原因,学习了下telnetlib模块中的Telnet的使用方法,记录一下。
     一些题外话:socket套接字中的流式套接字可以提供可靠的、面向连接的通信流。Telnet就是一个流式连接。

▲telnetlib库介绍

1)特性

     Telnet 表示到 Telnet 服务器的连接. 实例初始化后默认不连接;必须使用 open() 方法来建立连接。或者, 可选参数 host 和 port 也可以传递给构造函数,在这种情况下,到服务器的连接将在构造函数返回前建立。可选参数 timeout 为阻塞操作(如连接尝试)指定一个以秒为单位的超时时间(如果没有指定,将使用全局默认设置) 。
     
     不要重新打开一个已经连接的实例。

2)安装方法
pip install telnetlib

▲使用方法

1)实例化Telnet
def __init__(self):
    self.tn = telnetlib.Telnet()
    self.count = 0
2)建立telnet连接
self.tn.open(host_ip, port)
3)发送指令

     这里发送命令需要先使用ascii编码

self.tn.write(command.encode('ascii') + b'\n') 
4)查看返回值
self.tn.read_all()
5)退出telnet连接
self.tn.close()

或者

self.tn.write(b"exit\n")

▲常用函数的其他使用方式

1)open函数

     看源码可知,open有三个参数值,分别是host,port,timeout。
其中timeout=socket._GLOBAL_DEFAULT_TIMEOUT 中的_GLOBAL_DEFAULT_TIMEOUT默认值为object()

  • host:目标ip
  • port:目标端口
  • timeout:设置超时等待时间

在这里插入图片描述

2)read函数

     以下的示例由于项目原因都使用了decode,不需要请自行去掉~

  • read_until()
    找到指定字符串后返回,或 超时返回。
read_until(word, 30).decode('ascii')
  • read_very_eager()
    返回的是上次获取之后本次获取之前的所有输出。
    「有个问题是,缓存中的数据没办法返回」
read_very_eager().decode('ascii')
3)write函数
write(b"exit\n")

▲使用场景

1)登陆场景
  • 支持异常重试
    – 使用retry方法,通过stop_max_attempt_number指定异常次数
  • 支持返回连接异常
  • 支持返回登陆异常
@retry(stop_max_attempt_number=5)
    def login_host(self, host_ip, port):
        try:
            # self.tn = telnetlib.Telnet(host_ip,port=23)
            self.tn.open(host_ip, port)
        except:
            logging.warning('%s网络连接失败,请确认ip、port' % host_ip)
            return False
        time.sleep(1)
        # 获取登录结果
        # read_very_eager()获取到的是上次获取之后本次获取之前的所有输出
        command_result = self.tn.read_very_eager().decode('ascii')
        if 'Welcome to XXX' in command_result:
            logging.info('%s登录成功' % host_ip)
            return True
        else:
            logging.warning('%s登录失败' % host_ip)
            raise Exception('登陆失败,正在尝试重连...')
2)执行后获取返回结果
def execute_command(self, command):
    # 执行命令
    self.tn.write(command.encode('ascii') + b'\n')
    time.sleep(1)
    # 获取命令结果
    command_result = self.tn.read_very_eager().decode('ascii')
    logging.info('命令执行结果:\n%s' % command_result)
    return command_result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿槿吃糖

只要出现在这里,我就能看到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值