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

  • ▲写在前面
  • ▲telnetlib库介绍
  • 1)特性
  • 2)安装方法
  • ▲使用方法
  • 1)实例化Telnet
  • 2)建立telnet连接
  • 3)发送指令
  • 4)查看返回值
  • 5)退出telnet连接
  • ▲常用函数的其他使用方式
  • 1)open函数
  • 2)read函数
  • 3)write函数
  • ▲使用场景
  • 1)登陆场景
  • 2)执行后获取返回结果


▲写在前面

     最近因为项目原因,学习了下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:设置超时等待时间

python telnet模块 python的telnetlib_python telnet模块

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