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

使用Python Paramiko结合JSON连接两台Cisco路由器的代码及JSON问题排查

Python代码与JSON文件问题排查

Python代码存在的问题

  • 导入方式不规范:from paramiko import *会导入所有模块成员,容易引发命名冲突,建议明确导入所需类,比如from paramiko import SSHClient, AutoAddPolicy。
  • 文件操作不严谨:
    • 读取JSON文件用r+模式没必要,只读场景用'r'即可;
    • 未手动关闭文件,也没使用with语句自动管理文件资源,可能导致资源泄漏。
  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:15:38