使用Python Paramiko结合JSON连接两台Cisco路由器的代码及JSON问题排查
Python代码与JSON文件问题排查
Python代码存在的问题
- 导入方式不规范:
from paramiko import *会导入所有模块成员,容易引发命名冲突,建议明确导入所需类,比如from paramiko import SSHClient, AutoAddPolicy。 - 文件操作不严谨:
- 读取JSON文件用
r+模式没必要,只读场景用'r'即可; - 未手动关闭文件,也没使用
with语句自动管理文件资源,可能导致资源泄漏。
- 读取JSON文件用
- JSON遍历逻辑错误:你的JSON是数组结构,但代码里用
List_of_Devices['test']遍历,而JSON中根本没有test这个键,应该直接遍历List_of_Devices。 - 设备名称键不匹配:代码里用
device['name']获取设备名,但JSON里对应的键是HOST_NAME,会触发KeyError。 - SSH连接参数传递错误:
ssh_object.connect(device['SSH_IP,SSH_PORT,SSH_USER,SSH_PASSWORD'])完全不符合Paramiko的调用规范,connect需要分别传入hostname、port、username、password等参数,不是从一个不存在的键里取值。 - 命令执行结果处理错误:
exec_command会返回stdin, stdout, stderr三个对象,你直接调用后没接收返回值,反而用sys.stdout.readlines()读取本地标准输出,根本拿不到路由器的命令执行结果。 - 缩进错误:
for device in ...循环后的代码没有缩进,Python是缩进敏感语言,这会直接触发语法错误。 - 主机密钥加载冗余:已经设置了
AutoAddPolicy()自动添加未知主机密钥,ssh_object.load_host_keys()如果没有提前配置主机密钥文件,这个调用毫无意义,甚至可能引发异常。 - 输出文件未正确管理:打开输出文件后未手动关闭,建议用
with语句自动处理。
JSON文件存在的问题
- 键名与代码不匹配:JSON里的设备名称键是
HOST_NAME,但代码里用name访问,会导致无法获取设备名称;不过其他键名(SSH_IP、SSH_PORT等)本身是合理的,只需确保代码调用时对应正确。
修正后的代码示例
import json from paramiko import SSHClient, AutoAddPolicy # 用with语句管理JSON文件 with open('test.json', 'r') as json_file_object: list_of_devices = json.load(json_file_object) cmd_to_exec = 'show running-config' for device in list_of_devices: output_file_name = f"{device['HOST_NAME']}.txt" ssh_object = SSHClient() ssh_object.set_missing_host_key_policy(AutoAddPolicy()) # 正确传递SSH连接参数 ssh_object.connect( hostname=device['SSH_IP'], port=device['SSH_PORT'], username=device['SSH_USER'], password=device['SSH_PASSWORD'] ) # 获取命令执行结果 stdin, stdout, stderr = ssh_object.exec_command(cmd_to_exec) output = stdout.read().decode() # 读取字节流并解码为字符串 # 用with语句管理输出文件 with open(output_file_name, 'w') as file_object: file_object.write(output) ssh_object.close() # 关闭SSH连接
修正后的JSON文件(原结构无需修改,确保与代码键名对应即可)
[ { "HOST_NAME": "R1", "SSH_IP": "192.168.1.2", "SSH_PORT": 22, "SSH_USER": "wahid", "SSH_PASSWORD": "wahid" }, { "HOST_NAME": "R2", "SSH_IP": "192.168.1.3", "SSH_PORT": 22, "SSH_USER": "wahid", "SSH_PASSWORD": "wahid" } ]
内容的提问来源于stack exchange,提问作者Wahid Anwari
相关产品推荐
相关产品推荐

