使用Python管理网络设备( 二 )


文章插图
 


如果需要在远程设备上执行耗时很长的命令,就要强制Python等待一段时间,直到设备生成输出并将结果返回给Python,因此最好使用time.sleep() 。否则,Python可能得不到正确的输出结果 。
4.1.3 netmiko模块netmiko是Paramiko的增强版本,专门面向网络设备 。虽然Paramiko能够处理与设备的SSH连接并判断设备类型是服务器、打印机还是网络设备,但netmiko在设计时针对网络设备做了优化,能够更有效地处理SSH连接 。netmiko还支持各种不同的设备厂商和平台 。
netmiko也是对Paramiko的封装,它使用许多其他增强功能扩展了Paramiko,比如使用启用的密码直接访问所支持的设备,从文件读取配置并将推送到设备,在登录期间禁用分页显示,以及默认在每条命令后面加上回车符"n" 。
1.支持的设备商netmiko支持许多供应商的设备,并定期在支持列表中添加新的供应商 。netmiko支持的供应商列表分为定期测试类、有限测试类和实验类 。在该模块的GitHub页面上可以找到这个列表 。
定期测试类中支持的供应商如下图所示 。
使用Python管理网络设备

文章插图
 
有限测试类中支持的供应商如下图所示 。
使用Python管理网络设备

文章插图
 
实验类中支持的供应商如下图所示 。
使用Python管理网络设备

文章插图
 
2.安装和验证安装netmiko非常简单 。打开Windows命令行窗口或Linux shell,执行下面的命令就可以从PyPI获取最新版本的netmiko包(见下图) 。
pip install netmiko
使用Python管理网络设备

文章插图
【使用Python管理网络设备】 
然后,在Python shell中导入netmiko,验证模块是否正确地安装到Python site-packages中 。
$python>>>import netmiko3.使用netmiko建立SSH连接现在该开始使用netmiko了,让我们来看看它强大的SSH功能 。首先连接到网络设备并在上面执行命令 。默认情况下,netmiko在建立会话(session)的过程中会在后台处理许多操作(如添加未知的SSH密钥主机,设置终端类型、宽度和高度),在需要的时候还可以进入特权(enable)模式,然后通过运行供应商提供的命令来禁用分页 。
首先,以字典格式定义设备并提供下列5个必需的关键信息 。
R1 = ('device type ': 'cisco IOS','ip': '10.10.88.110','username': 'admin','password': 'access123','secret': 'access123',}第一个参数是device_type,为了执行正确的命令,需要使用这个参数来定义平台供应商 。然后,需要SSH的IP地址 。如果已经使用DNS解析了IP地址,该参数可能是主机名;否则,该参数是IP地址 。接下来,提供username、password以及以secret参数传递的特权模式的密码 。注意,可以使用getpass()模块隐藏密码,并且只在脚本执行期间提示它们 。

虽然变量中的密钥序列不重要,但是为了使netmiko能够正确解析字典并开始和设备建立连接,密钥的名称应该和之前示例中提供的密钥完全一样 。
接下来,从netmiko模块导入ConnectHandler函数,并提供定义的字典来开始建立连接 。因为所有的设备是通过特权模式的密码配置的,所以需要为创建的连接提供.enable(),以在特权模式下访问 。使用.send_command()在路由器终端上执行命令,.send_command()将会执行命令并通过变量的值显示设备的输出 。
from netmiko import ConnectHandlerconnection = ConnectHandler(**R1)connection.enable()output = connection.send_command("show ip int b")print output脚本输出结果如下 。
使用Python管理网络设备

文章插图
 
注意,这里看到的输出结果去掉了命令行中的命令回显和设备提示符 。默认情况下,netmiko会替换设备的返回结果,使输出更加整洁,替换过程通过正则表达式完成,这部分会在下一章中介绍 。
如果不想使用这种方式,而是希望看到命令提示符,并在返回结果的后面执行命令,可以在.send_command()函数中加上以下参数 。
output = connection.send_command("show ip intb",strip_command=False,strip_prompt=False)strip_command=False和strip_prompt=False告诉netmiko保留而不是替换命令行回显和提示符 。默认情况下它为True,可以根据需要进行设置 。


推荐阅读