暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Network Automation:实验一 SSH(Paramiko)

TechSharer 2021-12-29
1101

实验环境

编译器: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为日志服务器地址

相关说明

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 实验手册》


文章转载自TechSharer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论