Netmiko执行交换机两条命令返回结果均相同问题排查求助
问题修复方案
错误根源
- 核心问题是
re_table变量被重复赋值覆盖:你先将re_table赋值为showDesc对应的TextFSM模板对象,紧接着又重新赋值为showVlan对应的模板对象,后续解析第一条命令输出、写入第一个CSV表头时,用的都是已经被覆盖的showVlan模板,自然两个文件内容都是show vlan的相关结果。 - 额外冗余:代码中定义了两个重名的
cdp函数,没有任何实际作用,可以直接删除。 - 小缺陷:打开模板文件、CSV文件时没有使用上下文管理器,存在文件句柄泄漏的风险。
修复后代码
import textfsm from netmiko import ConnectHandler def device2(whid, idf, username, password): checkOnline = { "device_type": "cisco_ios", "host": "switch1-1", "username": username, "password": password, } command1 = "show interfaces description" command2 = "show vlan" with ConnectHandler(**checkOnline) as net_connect: out1 = net_connect.send_command(command1) out2 = net_connect.send_command(command2) # 处理第一条命令输出 with open("/var/assets/showDesc.textfsm") as template1: re_table1 = textfsm.TextFSM(template1) fsm_results1 = re_table1.ParseText(out1) with open("/var/assets/file1.csv", "w+") as outfile1: # 写入表头 outfile1.write(",".join(re_table1.header) + "\n") # 写入内容 for row in fsm_results1: outfile1.write(",".join(row) + "\n") # 处理第二条命令输出 with open("/var/assets/showVlan.textfsm") as template2: re_table2 = textfsm.TextFSM(template2) fsm_results2 = re_table2.ParseText(out2) with open("/var/assets/file2.csv", "w+") as outfile2: # 写入表头 outfile2.write(",".join(re_table2.header) + "\n") # 写入内容 for row in fsm_results2: outfile2.write(",".join(row) + "\n")
优化说明
- 将两个模板的TextFSM对象分别赋值给不同的变量
re_table1、re_table2,避免互相覆盖 - 使用
with关键字管理所有文件的打开/关闭逻辑,自动释放文件句柄 - 简化了CSV写入的循环逻辑,直接用
join方法拼接每行内容,代码更简洁 - 删除了无用的重名
cdp函数,减少冗余代码
内容的提问来源于stack exchange,提问作者HipYThON0
相关产品推荐
相关产品推荐

