You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:15:02