现在,我们已经知道如何在不同的操作系统中使用和安装Python以及如何使用EVE-NG搭建网络拓扑 。在本章中,我们将学习如何使用目前常用的网络自动化库自动完成各种网络任务 。Python可以在不同的网络层上与网络设备进行交互 。
首先,Python可以通过套接字编程和socket模块操纵底层网络,从而为Python所在的操作系统和网络设备之间搭建一个低层次的网络接口 。此外,Python模块还可以通过Telnet、SSH和API与网络设备进行更高级别的交互 。本章将深入探讨如何在Python中使用Telnet与SSH模块在远程设备上建立连接和执行命令 。
本章主要介绍以下内容:
- 使用Python通过Telnet连接设备;
- Python和SSH;
- 使用netaddr处理IP地址和网络;
- 网络自动化实战示例 。
- Python 2.7.1x;
- PyCharm社区版或专业版;
- EVE-NG,网络仿真器的安装和配置请参阅第3章 。
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,然后导入Paramiko模块,验证是否安装成功 。如下图所示,正确安装之后,能够成功导入模块 。也就是说,命令行上不会出现任何错误提示 。
文章插图
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()
最后,invoke_shell()将启动一个连接到SSH服务器的交互式shell会话 。在调用该函数时可以传入一些其他参数(如终端类型、宽度、高度等) 。
AutoAddPolicy()是一种策略,可以作为函数set_missing_host_key_policy()的输入参数 。在虚拟实验室环境中推荐使用这种策略,但在生产环境中应当使用更加严格的策略,如WarningPolicy()或RejectPolicy() 。
Paramiko的连接参数如下 。
- Look_For_Keys:默认为True,强制Paramiko使用密钥进行身份验证 。也就是说,用户需要使用私钥和公钥对网络设备进行身份验证 。在这里使用密码验证,因此将该参数设置为False 。
- allow_agent:表示是否允许连接到SSH代理,默认为True 。在用密钥验证时可能需要使用这个选项 。由于这里使用的是用户名/密码,因此禁用它 。
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爬虫常用的定位元素方法对比,你偏爱哪一款?
- Pyppeteer爬虫神器详解
- 6s管理包括哪六个方面?
- 出现化妆品过敏怎么办
- 《管理学原理》试卷a 2020?管理学原理试卷及答案
- 照相机的使用方法和注意事项
- ticpods2ai真无线耳机?ticpods2pro单耳使用
- 使用 Go 打造另一款简单实用的 ORM
- 使用Redis轻松实现秒杀系统
- 使用Arkime抓包,捕获解密HTTPS流量