使用Python管理网络设备

现在,我们已经知道如何在不同的操作系统中使用和安装Python以及如何使用EVE-NG搭建网络拓扑 。在本章中,我们将学习如何使用目前常用的网络自动化库自动完成各种网络任务 。Python可以在不同的网络层上与网络设备进行交互 。
首先,Python可以通过套接字编程和socket模块操纵底层网络,从而为Python所在的操作系统和网络设备之间搭建一个低层次的网络接口 。此外,Python模块还可以通过Telnet、SSH和API与网络设备进行更高级别的交互 。本章将深入探讨如何在Python中使用Telnet与SSH模块在远程设备上建立连接和执行命令 。
本章主要介绍以下内容:

  • 使用Python通过Telnet连接设备;
  • Python和SSH;
  • 使用netaddr处理IP地址和网络;
  • 网络自动化实战示例 。
4.1 技术要求应检查是否正确安装了下列工具并保证它们能够正常使用:
  • Python 2.7.1x;
  • PyCharm社区版或专业版;
  • EVE-NG,网络仿真器的安装和配置请参阅第3章 。
本章中出现的所有脚本请参见GitHub网站 。
4.1.1 Python和SSHSSH和Telnet的不同之处在于客户端与服务器之间交换数据的通道不一样 。SSH使用的是安全链路,在客户端和设备之间创建了一个使用不同的安全机制进行加密的隧道,通信内容很难被解密 。因此在需要保证网络安全的时候,网络工程师会首先选择使用SSH协议 。
Paramiko库遵循SSH2协议,支持身份验证,密钥处理(DSA、RSA、ECDSA和ED25519),以及其他SSH功能(如proxy命令和SFTP) 。在Python中当需要使用SSH连接到网络设备时通常使用这个库 。
4.1.2 Paramiko模块Paramiko是Python中应用最广的SSH模块 。模块本身使用Python语言编写和开发,只有像crypto这样的核心函数才会用到C语言 。从其GitHub官方链接上能够看到代码的贡献者和模块历史等诸多信息 。
1.安装模块打开windows cmd或linux shell,运行下面的命令,从PyPI下载最新的Paramiko模块 。如下图所示,同时,该命令会自动下载其他依赖包(如cyrptography、ipaddress和six),并将它们安装到计算机上 。
pip install paramiko
使用Python管理网络设备

文章插图
 
在命令行中输入Python,然后导入Paramiko模块,验证是否安装成功 。如下图所示,正确安装之后,能够成功导入模块 。也就是说,命令行上不会出现任何错误提示 。
使用Python管理网络设备

文章插图
 
2.用SSH连接网络设备如前所述,要使用Paramiko模块,首先需要在Python脚本中导入它,然后通过继承SSHClient()来创建SSH客户端 。然后,设置Paramiko的参数,使其能够自动添加任意未知的主机密钥并信任与服务器之间的连接 。接下来,将远程主机的信息(IP地址、用户名和密码等)传递给connect函数 。
#!/usr/bin/python__author__ = "Bassim Aly"__EMAIL__ = "basim.alyy@gmail.com"import paramikoimport timeChannel = paramiko.SSHClient()Channel.set_missing_host_key_policy(paramiko.AutoAddPolicy())Channel.connect(hostname="10.10.88.112", username='admin',password='access123', look_for_keys=False,allow_agent=False)shell = Channel.invoke_shell()

AutoAddPolicy()是一种策略,可以作为函数set_missing_host_key_policy()的输入参数 。在虚拟实验室环境中推荐使用这种策略,但在生产环境中应当使用更加严格的策略,如WarningPolicy()或RejectPolicy() 。
最后,invoke_shell()将启动一个连接到SSH服务器的交互式shell会话 。在调用该函数时可以传入一些其他参数(如终端类型、宽度、高度等) 。
Paramiko的连接参数如下 。
  • Look_For_Keys:默认为True,强制Paramiko使用密钥进行身份验证 。也就是说,用户需要使用私钥和公钥对网络设备进行身份验证 。在这里使用密码验证,因此将该参数设置为False 。
  • allow_agent:表示是否允许连接到SSH代理,默认为True 。在用密钥验证时可能需要使用这个选项 。由于这里使用的是用户名/密码,因此禁用它 。
最后一步,把各种命令(如show ip int b和show arp)发送到设备终端,并将返回结果输出到Python窗口中 。
shell.send("enablen")shell.send("access123n")shell.send("terminal length 0n")shell.send("show ip int bn")shell.send("show arp n")time.sleep(2)print shell.recv(5000)Channel.close()脚本运行结果如下图所示 。
使用Python管理网络设备


推荐阅读