Python 网络设备管理:保存和下载设备配置
导入必要的模块
from ncclient import manager # 用于与网络设备建立 NETCONF 连接 import paramiko # 用于通过 SSH 与网络设备建立连接 import time # 用于等待命令执行完成 import datetime # 用于生成文件名
定义设备 IP 地址、用户名和密码
DEVICE_IP = '10.1.0.6' USERNAME = 'python' PASSWORD = 'Huawei@123'
定义 Device 类
class Device(): # 初始化方法 def init(self, ip, usr, pwd): self.hostname = ip # 设备 IP 地址 self.username = usr # 登录设备的用户名 self.password = pwd # 登录设备的密码 self.client = self._get_connect() # 通过 SSH 与设备建立连接 self.cli = self.client.invoke_shell() # 打开交互式 Shell self.cli.send('n\n') # 发送回车键 self.cli.send('screen-length 0 temporary\n') # 发送命令,设置输出为不分页
# 通过 SSH 与设备建立连接
def _get_connect(self):
ssh_con = paramiko.SSHClient() # 创建 SSHClient 实例
ssh_con.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 设置自动添加主机密钥
ssh_con.connect(hostname=self.hostname, username=self.username, password=self.password, timeout=10) # 通过 SSH 连接到设备
return ssh_con # 返回 SSH 连接对象
# 检查风扇状态
def check_fan_status(self, output):
lines = output.split('\n') # 将命令输出按行分割成列表
fan_status = {} # 初始化字典,用于保存风扇状态
for line in lines:
if 'Fan' in line: # 如果该行包含 'Fan' 字符串
fan_name = line.split(':')[0] # 获取风扇名称
fan_state = line.split(':')[1].strip() # 获取风扇状态
if 'Normal' not in fan_state: # 如果风扇状态不是 'Normal'
fan_status[fan_name] = fan_state # 将风扇名称和状态保存到字典中
if not fan_status: # 如果所有风扇状态都正常
print('All fans are working normally!') # 打印提示信息
else: # 如果有风扇状态异常
print('Fan status:') # 打印提示信息
for fan_name, fan_state in fan_status.items(): # 遍历所有异常风扇的名称和状态
print(f'{fan_name}: {fan_state}') # 打印风扇名称和状态
# 打开交互式 Shell,执行命令,检查风扇状态,将输出写入文件
def open(self):
with open('command.txt', 'r') as f: # 打开文件,读取命令列表
cmd_list = f.readlines() # 将命令列表读取到列表中
for cmd in cmd_list: # 遍历所有命令
self.cli.send(cmd) # 发送命令
time.sleep(1) # 等待命令执行完成
COMMAND = self.cli.recv(65535).decode('utf-8') # 获取命令输出,转换为字符串
# 输出命令输出
print(COMMAND)
# 检查风扇状态
self.check_fan_status(COMMAND)
# 将命令输出写入文件
timestamp = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') # 根据当前时间生成时间戳
filename = f'{DEVICE_IP}_{timestamp}.txt' # 根据设备 IP 和时间戳生成文件名
with open(filename, 'w') as f: # 创建文件,写入命令输出
f.write(COMMAND)
# 关闭 SSH 连接
def close(self):
self.client.close()
# 保存设备配置到指定文件
def save_config(self, filename):
with manager.connect(host=self.hostname, port=830, username=self.username, password=self.password, hostkey_verify=False, device_params={'name': 'huawei'}) as m:
config = m.get_config(source='running').data_xml
with open(filename, 'w') as f:
f.write(config)
print(f'Saved device configuration to {filename}.')
# 下载已经保存的配置
def download_config(self, filename):
with manager.connect(host=self.hostname, port=830, username=self.username, password=self.password, hostkey_verify=False, device_params={'name': 'huawei'}) as m:
with open(filename, 'r') as f:
config = f.read()
m.edit_config(target='running', config=config, default_operation='merge')
print(f'Downloaded configuration from {filename} to device.')
如果该脚本被直接运行
if name == 'main': device = Device(DEVICE_IP, USERNAME, PASSWORD) # 创建 Device 对象,传入设备 IP、用户名和密码 device.open() # 打开 Shell,执行命令,检查风扇状态,将输出写入文件 device.save_config('config.xml') # 保存设备配置到文件 device.download_config('config.xml') # 下载已经保存的配置到设备 device.close() # 关闭 SSH 连接
原文地址: https://www.cveoy.top/t/topic/n4vh 著作权归作者所有。请勿转载和采集!