使用 telnetlib 执行 Telnet


# 使用 telnetlib 执行 Telnet

# 关于 Telnet

Telnet 是一种允许用户与远程服务器通信的网络协议,它经常被网络管理员用来远程访问和管理设备。在终端中运行 Telnet 命令,并给出远程服务器的 IP 地址或主机名,即可访问远程设备。

Telnet 基于 TCP,默认端口号为 23。首先需要确保它已安装在我们的系统上,如果没有安装,运行以下命令进行安装:

sudo apt-get install telnetd
1

要使用简单的终端运行 Telnet,只需要输入以下命令:

telnet ip_address_your_remote_server
1

# Python 实现 Telnet 功能

首先需要用到 Python 的 telnetlib 模块,它是一个标准库,无需另外安装。

下面是一个使用 Telnet 连接远程设备的示例程序(telnet_example.py (opens new window)):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import telnetlib
import time


def do_telnet(host, username, password, commands):
    try:
        tn = telnetlib.Telnet(host, port=23, timeout=10)
    except:
        print('{host} 网络连接失败'.format(host=host))
        return False

    # 输入登录用户名
    # 这里要设置下 timeout,否则会一直在等待关键字符出现,直至默认的超时时间(很久)
    tn.read_until('Username:', timeout=2)
    tn.write(username + '\n')

    # 输入登录密码
    tn.read_until('Password:', timeout=2)
    tn.write(password + '\n')

    time.sleep(2)
    res = tn.read_very_eager()
    if 'Local authentication is rejected' in res:
        print('{host} 登录失败,用户名或密码错误'.format(host=host))
        return False

    # 登录完毕后执行命令
    for command in commands:
        tn.write(command + '\n')
        time.sleep(2)
        res = tn.read_very_eager()
        print(res)

    # 执行完毕后,终止 Telnet 连接(或输入 exit 退出)
    tn.close()


if __name__ == "__main__":
    host = '192.168.10.x'
    username = 'admin'
    password = '******'
    commands = ['display version', 'display interface description Vlanif']
    do_telnet(host, username, password, commands)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

telnetlib 模块里上面代码中用到的方法介绍:

  • write():使用该方法向服务端发送命令,注意每个命令后要跟上换行符(\n)。
  • read_until():当结果中存在想要的信息时返回。
  • read_very_eager():返回缓冲区中所有可用的数据(上次获取之后本次获取之前的所有输入输出),这里要设置延时 time.sleep(2),才能保证数据读取完毕。

telnetlib 采用缓冲的处理方式,因此数据并不是一下子就返回的,而是先放在了缓冲区中,许多的读取处理都是围绕着这个缓冲区来的。而缓冲区的信息何时到达是不固定的,也许很快,也许很慢,也许分别到达,也许一下子就收到了。因此,对于数据不一定到齐的这种情况,就采用了 read_until() 来判断缓冲区中的数据是否有想要的内容,如果没有就等待,除非到达了超时时间。

# 总结

上面的示例程序使用 telnetlib 模块访问了 Huawei 交换机。首先从用户那里获取用户名和密码,以初始化与远程设备的 Telnet 连接。建立连接后,在远程设备上进行了进一步配置。远程登陆后,用户将能够访问远程服务器或设备。

如果远程连接其它厂家的设备,在连接时可能会有二次验证,以及连接验证失败时给出的错误提示会不同,需要具体问题具体分析。

但是这个 Telnet 协议有一个非常严重的缺点,即所有数据,包括用户名和密码都是以明文方式通过网络发送的,这会有安全风险。因此,现在我们很少使用 Telnet,并且它被一个非常安全的协议 Secure Shell 所取代,简称 SSH。

# 参考资料

(完)