将网络设备的配置做备份是网络运维中必不可少的一项工作,根据公司规模和要求不同,管理层可能会要求对网络设备的配置做月备,周备甚至日备。
传统的备份网络交换机配置的办法是手动远程登陆设备,然后输入display current-configuration,将回显内容手动复制到文本文件上,效率十分低下,在成百上千台设备需要备份的网络中尤为明显。
接下来我将会使用python 自动化实现华为交换机的配置备份,备份到FTP服务器上
云配置
云的配置是为了让主机能与交换机互相访问
拓扑
目的
使用python 自动化实现华为交换机的配置备份,备份到FTP服务器上
当我们的设备如果足够多的时候,我们可以使用文本文档的方式进行远程登陆,让python遍历我们的文档中的IP地址,实施自动化登陆
我们的python文件建议跟文本文件放在同一文件夹
ip_list:
192.168.56.10
192.168.56.11
192.168.56.12
交换机配置
aaa
local-user admin password cipher Huawei@123 //创建python用户,密码为123
local-user admin privilege level 15
local-user admin service-type ssh
#
user-interface vty 0 4
authentication-mode aaa
protocol inbound ssh
#
stelnet server enable
ssh user admin authentication-type all
ssh user admin service-type all
ssh client first-time enable
这个时候我们就能与交换机互访,并SSH登陆了
FTP服务器配置
我使用的是ensp 的交换机作为本次实验的FTP服务器,现网中有专门的FTP服务器
ftp server enable
#
aaa
local-user admin1234 password irreversible-cipher Helloworld@6789
local-user admin1234 privilege level 15
local-user admin1234 service-type ftp
local-user admin1234 ftp-directory flash:/
代码
import time # 导入时间模块
import paramiko # 导入paramiko模块
username = input("Username: ") # 获取用户名输入
password = input("Password: ") # 获取密码输入
f = open("ip_list.txt") # 打开存储IP地址清单的文件
for idx, line in enumerate(f.readlines(), start=1): # 遍历文件中的每一行IP地址
ip = line.strip() # 去除行尾的换行符,获取IP地址
ssh_client = paramiko.SSHClient() # 创建SSH客户端实例
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 设置自动添加主机密钥
ssh_client.connect(hostname=ip, username=username, password=password, look_for_keys=False) # 连接SSH客户端到交换机
print("Successfully connect to ", ip) # 打印连接成功的消息
command = ssh_client.invoke_shell() # 开启交互式Shell
command.send(b"screen-length 0 temporary\n") # 发送命令,设置交换机临时显示长度
command.send(b"save\n") # 发送保存命令
command.send(b"Y\n") # 确认保存配置
command.send(b"ftp 192.168.56.4\n") # 连接FTP服务器
command.send(b"admin\n") # 发送FTP用户名
command.send(b"Huawei@123\n") # 发送FTP密码
command.send(b"binary\n") # 设置传输模式为二进制
command.send(f"put vrpcfg.zip SW{idx}\n".encode('utf-8')) # 上传备份文件到FTP服务器并以不同的索引命名
print(f"Upload SW{idx} successful") # 打印上传成功的消息
command.send(b"q\n") # 退出FTP
time.sleep(2) # 等待2秒,确保交互命令执行完成
output = command.recv(65535) # 接收命令的输出结果
print(output.decode('ascii')) # 打印输出结果
ssh_client.close() # 关闭SSH连接
f.close() # 关闭文件
结果