实验环境
编译器:Jupyter Notebook或者PyCharm
实验设备:思科或者华为网络设备
实验环境与目标
测试环境中有一台思科Nexus交换机,运行python脚本的PC与交换机地址:1.1.1.1三层互通,现需要通过配置python脚本实现通过ssh会话的方式回显/配置交换机。
代码解析
交换机端的ssh用户配置这里不再重复,用户名/密码:admin/admin@123,这里建立ssh会话的模块使用的是paramiko,它支持口令或者公钥两种形式登录设备,这里我们选择常见的口令方式登录设备。
1.导入模块
import paramiko
import time
2.调用SSHClient()方法赋值给ssh
ssh = paramiko.SSHClient()
3.默认情况下,paramiko会拒绝所有未知的ssh公钥,通过该policy使得paramiko接受ssh服务器端提供的公钥,即连接时不需要输入yes进行确认,这个建议标准配置,不可或缺
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
4.调用connect()函数进行ssh登录,其中hostname ,username,password 为必填项,当然也可以通过key_filename参数来指定公钥文件来登录;具体参数细节参见 https://docs.paramiko.org/en/stable/api/client.html
ssh.connect(hostname='1.1.1.1',port=22,username='admin',password='admin@123')
print('login succesfully')
5.调用invoke_shell()方法,在ssh会话之上建立一个逻辑通道channel,启动shell会话,并赋值给cli
cli = ssh.invoke_shell()
6.查看交换机log服务器相关配置,并设置2.2.2.2为log服务器地址
cli.send("show running | in logging \n")
cli.send("configure terminal \n")
cli.send("logging server 2.2.2.2 \n")
cli.send("sh running-config | in logging \n")
cli.send("copy running-config startup-config \n")
7.由于python为一次性执行所有脚本的内容,无间隔时间,这样会导致回显内容显示不完整,故在recv( )函数保存结果之前,将python休眠一段时间(默认单位:s),这个时间取决于你的回显内容多少
time.sleep(5)
8.通过recv()函数保存回显内容,数据量最大999999bytes,注意:当你的命令行回显内容过多时,要将 数据量调大,不然也会导致显示不全,最后通过decode()函数将字节型字符串转换为utf-8格式,方便阅读
show_run = cli.recv(999999).decode()
print(show_run)
9.关闭ssh会话通道,由于vty通道有限所以需要关闭通道
ssh.close()
运行结果
从图中我们可以看到,我们成功查看到log服务器相关配置 且 配置2.2.2.2为日志服务器地址
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20220921_fb6b7302-397d-11ed-b3f8-fa163eb4f6be.png)
相关说明
paramiko 作为python中支持ssh协议实现远程连接设备的模块之一,是一个非常著名的开源SSHv2项目,
基于Python2.7,3.4+,同时支持SSH的服务端和客户端,于2013年左右发布,最早作者是Jeff Forcier。
1.从上面的命令行我们可以看出,通过paramiko模块进行ssh登录执行命令行时,需要一些前置配置和保存配置,比如要先进入全局配置模式,某些cisco_ios设备甚至需要先进入特权模式,同时在执行完成后需要保存运行配置到flash中等。
2.在脚本执行过程中,我们需要通过time.sleep()函数来设定休眠时间保证回显内容能被全部打印,而实际在操作的过程中,这个时间会根据你命令行的多少发生变化,可能导致脚本执行时间过长,同样的,recv()函数的最大数据量也是根据实际情况变化的。
3.在connect()函数的参数中,有一项为默认配置:look_for_keys=True 即默认会从公钥文件中寻找公钥去登录设备,这样会导致“授权失败”问题,所以建议look_for_keys=False
鉴于上述遇到的各种问题,实验二我们将通过python中的另一ssh协议模块:netmiko
来实现上述功能,对比下这两个模块的优劣势。
参考文档
1.https://www.paramiko.org/
2.https://github.com/paramiko/paramiko
3.《HCIP-Datacom-Network Automation Developer V1.0 实验手册》