使用Netmiko批量连接网络设备执行show run并解析配置的问题求解
问题修复方案
核心错误点
- 函数未定义入参,全局变量
hostname是numpy数组而非单个IP,无法支持多设备遍历 - 设备遍历的for循环被注释,仅执行了一次处理逻辑
- 临时文件写入后未先关闭就调用
CiscoConfParse读取,缓冲区内容未刷入磁盘,导致后续设备解析时读取到不完整配置 - Windows路径未使用raw字符串或转义符,可能触发路径转义异常
- 不必要的numpy数组转换,直接遍历读取到的主机列表即可
修正后代码
from netmiko import ConnectHandler import getpass import os.path from ciscoconfparse import CiscoConfParse # 读取用户名密码 uname = input("Enter your username :") p = getpass.getpass(prompt="Enter your password: ") # 读取设备列表,路径用raw字符串避免转义 filepath = r"D:\Scripts\IOSDevices.csv" with open(filepath, 'r') as f: hosts = f.read().splitlines() print(f"读取到设备列表:{hosts}") def run_parseconfig(device_ip): # 写入临时配置文件 with open(r".\tmp_file_conf.txt", "w+") as cf: # 连接设备 device = ConnectHandler(device_type='cisco_ios', ip=device_ip, username=uname, password=p) output = device.send_command("show run") device.disconnect() print(output) cf.write(output + "\n") # 关闭文件后再解析,保证读取到完整内容 parse = CiscoConfParse(r".\tmp_file_conf.txt") hostname_objs = parse.find_objects("^hostname") service_objs = parse.find_objects("^service") # 写入结果文件 with open(r"D:\Scripts\IOS-DEVICES.txt", "a+") as f: f.write(f"**** {device_ip} ****\n\n") for h_obj in hostname_objs: print(h_obj.text) f.write(h_obj.text + "\n") for s_obj in service_objs: print(s_obj.text) f.write(s_obj.text + "\n") f.write(f"\n**** End of {device_ip}'s Commands\n\n") # 遍历所有设备执行处理 for host in hosts: run_parseconfig(host)
优化说明
- 用
with上下文管理器处理文件IO,自动完成文件关闭、缓冲区刷入操作,避免手动管理文件句柄的疏漏 - 移除不必要的numpy依赖,简化逻辑
- 函数接收单个IP作为入参,每次调用处理独立设备,避免全局变量污染导致的逻辑异常
内容的提问来源于stack exchange,提问作者L. Shouse
相关产品推荐
相关产品推荐

