1.实验介绍及拓扑
公司交换机,管理 IP 地址为 192.168.0.101/24。现编写自动化脚本,查看设备当前配置文件。
2.掌握内容及配置思路
2.1掌握内容
Python 基本语法
telnetlib 基本方法
2.2配置思路
1. 完成设备 Telnet 预配置
(配置 Telnet 密码,开启 Telnet 功能和允许 Telnet 登录)
2. 编写 Python 脚本:调用 telnetlib 登陆设备,然后查看配置。
3 配置步骤
3.1 安装python和VMware
3.1.1 python 官网下载并安装
3.1.2 VMware下载安装并修改配置
自行下载
虚拟机下载安装后出现两个虚拟网卡
更改其中VMnet8配置
3.1.3 pycharm下载安装
3.2 自己电脑真实网卡桥接网云cloud
进行如下配置
3.3交换机的 Telnet 预配置
#认证模式为密码认证
# 创建 Telnet 登陆密码
# 应用在telnet协议
# 特权15
#开启telnet服务#配置管理地址vlan1 192.168.0.101 /24
S1
#sys
#
undo info-center enable
#
user-interface vty 0 4
authentication-mode password
set authentication password ci huawei@123
protocol inbound telnet
user privilege level 15quit
#
telnet server enable#
int g0/0/0
ip add 192.168.0.101 24
3.4测试自己电脑和路由器联通性
因为本电脑是0.100 而 esnp上vlan 1配置0.101
测试telnet 路由器是成功的
3.5 Python脚本式运行
pycharm需要license ,改交互式运行吧(有时间用ssh做吧)
3.6 Python交互式运行
执行如下命令
import telnetlib
import time host = '192.168.0.101'
password = 'huawei@123'
tn = telnetlib.Telnet(host)
tn.read_until(b"Password:")
tn.write(password.encode('ascii') + b"\n")
tn.write(b"screen-length 0 temporary \n")
tn.write(b"dis cu \n")
time.sleep(2)
print(tn.read_very_eager().decode("ascii"))
tn.close()
4 代码解析
步骤 1 导入模块
import telnetlib
import time
导入本段代码中需要使用的telnetlib和time两个模块。这两个模块都是Python自带的模块,无需安装。
本章节主要介绍Telnetlib作为客户端的常用类和方法,例如Telnet类下read_until、read_very_eager()、write()等方法。更多Telnet的方法请参考telnetlib官方文档:https://docs.python.org/3/library/telnetlib.html#telnet-example。
Python默认无间隔按顺序执行所有代码,在使用telnet向交换机发送配置命令时候可能会遇到响应不及时或者设备回显信息显示不全。此时,可以使用time模块下的sleep方法来人为暂停程序。
步骤 2 登录设备
调用telnetlib里Telnet类的多种方法登录S1。
host = '192.168.0.101'
password = 'huawei@123'
tn = telnetlib.Telnet(host)
首先创建两个变量,host和password分别为设备的登录地址和密码,与设备配置参数一致。因为本例中仅在设备配置telnet密码方式登陆,所以无需用户名。
telnetlib.Telent()表示调用telnetlib类下的Telnet()方法。这个方法中包含登陆的参数,包括IP地址和端口号等信息。不填写端口信息则默认为23号端口。
本例中tn = telnetlib.Telnet(host),表示登陆host='192.168.0.101'的设备,然后将telnetlib.Telnet(host)赋值给tn。
tn.read_until(b"Password:")
正常Telnet登陆192.168.0.101设备时候,会有如下回显信息:
请注意程序并不知道需要读取到什么信息为止,所以我们使用read_until()指示读取到括号内信息为止。
本例中tn.read_until(b"Password:")表示读取到显示 "Password:"为止。其中字符串“Password:”前的“b”表示将Python3中默认的unicode编码变为bytes。这是函数对输入数据的要求,具体内容可以查看telnetlib官方文档,若不携带则程序会报错。
tn.write(password.encode('ascii') + b"\n")
在代码读取到显示"Password:"后,程序需输入参数password。这个参数在前面已定义,作为Telent登录的密码。使用write()完成password的写入。
本例中tn.write(password.encode('ascii') + b"\n"),输入的内容由两个部分组成,password.encode('ascii') 和b"\n"。password.encode('ascii')表示转换password代表的字符串“huawei@123”的编码类型为ASCII。“+”表示将该符号前后的字符串连接。“\n”为换行符,相当于输入后敲击回车键。所以本行代码含义为输入密码“huawei@123”并敲击回车键。
步骤 3 输入配置命令
Telnet到设备后,使用Python脚本向设备输入执行命令。
tn.write(b'display cu \n')
继续使用write()向设备输入命令。输入的命令“display cu”为“display current-configuration”的缩写,其功能是显示设备的当前配置。
time.sleep(1)
time.sleep(1)的作用是将程序暂停1秒。用于等待交换机回显信息,然后再执行后续代码。如果没有设置等待时间,则程序会直接执行下一行代码,导致没有数据可供读取。
print(tn.read_very_eager().decode('ascii'))
print()表示显示括号内的内容到控制台。
tn.read_very_eager()表示读取当前的尽可能多的数据。
. decode('ascii'))表示将读取的数据解码为ASCII。
本例中这段代码的功能为将输入“display cu”后1秒内S1输出的信息显示到控制台。
步骤 4 关闭会话
tn.close()
调用close()关闭当前会话。设备vty连接数量有限,在执行完脚本后需要关闭此telnet会话。