Python网络自动化运维—SSH模块
目录
SSH建立过程
实验环境准备
一.SSH模块
1.1.Paramiko模块
1.1.1实验代码
1.1.2代码分段讲解
1.1.3代码运行过程
1.2Netmiko模块
Netmiko模块对比paramiko模块的改进:
1.2.1实验代码
1.2.2代码分段讲解
1.2.3代码运行过程
二.Paramiko模块和Netmiko模块常用函数总结
Paramiko模块
Netmiko模块
前言
本章主要介绍Python中的SSH模块和框架在网络运维中的具体应用,所有实验均针对华为设备,在ensp模拟器上演示。
SSH建立过程
详细了解SSH服务,请点击此处
抓包结果如下:
加密算法协商阶段
抓包结果如下:
密钥交换阶段 :
点击此处详细了解DH算法
客户端发送DH密钥
服务端发送DH公钥
实验环境准备
拓扑图:
基础配置
一.SSH模块
Python中主要支持SSH协议实现远程连接设备的模块主要有Paramiko和Netmiko两种。
1.1.Paramiko模块
Netmiko模块是基于Paramiko模块的二次开发。一般来说,Netmiko对用户比较友好,容易上手,但有时候会增加额外开销,如内置主动延迟等,因此,多掌握些朴素的Paramiko模块,则Python自动化实施起来更加灵活。
下面我们使用Paramiko模块来完成上面的拓扑实验来登录路由器并为他的loopback1端口配置IP地址1.1.1.1/32。
Paramiko模块是一个第三方模块,需要手动安装,我使用的Python IDE工具Pycharm自动安装,如下图,鼠标放在未安装的模块下方红色波浪线处,自动弹出安装界面。
1.1.1实验代码
import paramiko
import time
ip = "192.168.223.10"
username = "zt"
password = "1234"
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip,username=username,password=password)
print("Successfully connected to ",ip)
commend = ssh_client.invoke_shell()
commend.send("sys\n")
commend.send("int loop 1\n")
commend.send("ip address 1.1.1.1 255.255.255.255\n")
commend.send("return\n")
commend.send("save\n")
commend.send("Y\n")
time.sleep(2)
output = commend.recv(65535)
print (output.decode("ascii"))
ssh_client.close()
1.1.2代码分段讲解
模块导入部分
import paramiko
import time
变量初始化部分
ip = "192.168.223.10"
username = "zt"
password = "329161"
SSH客户端创建与连接部分
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip,username=username,password=password)
print("Successfully connected to ",ip)
commend = ssh_client.invoke_shell()
commend.send("sys\n")
commend.send("int loop 1\n")
commend.send("ip address 1.1.1.1 255.255.255.255\n")
commend.send("return\n")
commend.send("save\n")
commend.send("Y\n")
time.sleep(2)
output = commend.recv(65535)
print (output.decode("ascii"))
1.1.3代码运行过程
实验结果:
1.2Netmiko模块
Netmiko模块是基于Paramiko模块的二次开发。一般来说,Netmiko对用户比较友好,容易上手,下面我们使用Netmiko模块来完成上面的拓扑实验来登录路由器并为他的loopback2端口配置IP地址2.2.2.2/32。
Netmiko模块是第三方模块,需手动安装,安装方法和Paramiko模块一致,此处不再赘述。
Netmiko模块对比paramiko模块的改进:
对不同厂商设备支持方面:
ConnectHandler
中通过 device_type
可以自动使用相应厂商的命令配置逻辑,无需担心不同厂商设备在命令语法、提示符等方面的差异。设备连接方面:
SSHClient
对象,设置主机密钥策略,然后通过 connect
方法进行连接。ConnectHandler
函数,通过一个包含设备信息的字典作为参数进行连接,更加简洁和直观。device_type
可以帮助 netmiko 针对不同厂商的设备使用不同的驱动,方便对不同厂商设备的操作。命令配置发送方面
send
方法发送每条命令且命令后必须添加'''\n'参数来使python模拟回车操作。send_config_set
方法可以接收一个命令列表,将这些命令按顺序发送到设备上,并自动处理命令的输入确认即回车。quit
或 return
等命令(根据具体情况),让设备从系统视图回到用户视图,而不需要用户手动添加这些命令。结果处理方面
recv
方法接收数据,且需要手动指定接收的字节数,还需要使用 decode
方法进行解码,同时使用 time.sleep
来等待设备处理,防止Python一次性执行完所有脚本中的命令,中间没有间隔时间,导致某些命令遗漏send_config_set
方法会自动等待命令执行完成并返回执行结果,无需手动处理等待和接收字节的问题,结果处理更加方便和高效。1.2.1实验代码
import netmiko
R1 = {
'device_type': 'huawei',
'ip': '192.168.223.10',
'username': 'zt',
'password': '1234'
}
ssh_client = netmiko.ConnectHandler(**R1)
print("Successfully connected to " + R1['ip'])
config_commands = ['interface Loopback2', 'ip address 2.2.2.2 255.255.255.255']
output = ssh_client.send_config_set(config_commands)
print(output)
save_output = ssh_client.send_command_timing('save')
#上述代码也可用下面的代码替代
#output = ssh_client.send_command('save', expect_string='Are you sure to continue')
if "Are you sure to continue" in save_output:
confirm_output = ssh_client.send_command_timing("yes")
print(confirm_output)
print("Successfully to save config...")
ssh_client.disconnect()
1.2.2代码分段讲解
import netmiko
netmiko
库,以便使用其功能 R1 = {
'device_type': 'huawei',
'ip': '192.168.223.10',
'username': 'zt',
'password': '1234'
}
device_type
表示设备类型,ip
是设备的 IP 地址,username
和 password
是登录凭证 ssh_client = netmiko.ConnectHandler(**R1)
print("Successfully connected to " + R1['ip'])
ConnectHandler
函数建立与设备的连接,**R1
是将字典中的键值对作为关键字参数传递,并打印连接成功的消息config_commands = ['interface Loopback2', 'ip address 2.2.2.2 255.255.255.255']
output = ssh_client.send_config_set(config_commands)
print(output)
注:除了我们代码里写的命令,send_config_set函数额外替我们输入了 2个命令,一个是"system-view",一个是“return”,详情查看下方代码配置过程图片
save_output = ssh_client.send_command_timing('save', read_timeout=30)
print(save_output)
if "Are you sure to continue" in save_output:
confirm_output = ssh_client.send_command_timing("yes", read_timeout=30)
print(confirm_output)
send_command_timing
方法发送 save
命令,read_timeout
参数设置读取超时时间为 30 秒,存储输出结果。save
命令的输出中是否包含确认信息,如果包含确认信息,发送yes命令保存配置注意:使用save命令保存配置时,由于send_config_set函数会发送system-view命令从而自动进入系统视图,而save命令在系统视图下无法使用,因此需使用send_command_timing函数进行异步发送save命令保存配置。
1.2.3代码运行过程
实验结果:
二.Paramiko模块和Netmiko模块常用函数总结
Paramiko模块
创建SSH客户端
paramiko.SSHClient()
创建SSH连接
paramiko.SSHClient.connect()
必要参数:hostname,ip,username,password
打开设备的命令行界面
paramiko.SSHClient.invoke_shell()
向对端设备发送命令
paramiko.SSHClient.invoke_shell.send()
设备客户端paramiko模块能够接受的最大字节数
paramiko.SSHClient.recv(65535)
自动接受SSH服务端的公钥
paramiko.SSHClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
Netmiko模块
创建一个SSH客户端连接,函数中的参数为SSH服务端的主机名/IP/账户/密码等信息
netmiko.ConnectHandler(**R1)
向SSH服务端发送一组配置命令,其参数为命令列表
netmiko.ConnectHandler.send_config_set()
向SSH服务端发送单个配置命令,适用于需要交互的命令,因为它会自动根据设备的输出提示符来判断命令是否执行完成。
netmiko.ConnectHandler.send_command_timing
总结
作者:北 染 星 辰