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

Paramiko循环连接多路由器执行命令 单IP正常多IP失效问题求助

Paramiko批量SSH连接路由器多IP执行失败修复

核心问题原因

你的脚本存在4个直接导致多IP场景运行失败的问题:

  • 用readlines()读取IP列表时,每行末尾默认带换行符\n,单IP场景下如果文件末尾没有换行可以正常连接,多IP场景下除最后一行外的所有IP都携带多余换行符,传入连接方法时会直接触发域名解析失败
  • 缩进逻辑错误:发送命令、读取输出、关闭连接的代码全部写在for循环外部,循环仅执行创建连接、唤起shell的操作,循环结束后remote_connection仅指向最后一个IP的shell实例,前面创建的所有SSH连接全部泄漏,还可能触发设备的SSH连接数上限
  • 连接关闭方法调用错误:ssh_client.close缺少括号,仅引用了方法对象没有实际执行关闭逻辑,连接不会被主动释放
  • 缺少异常处理:单个IP连接失败时会直接中断整个脚本,不会继续处理后续IP

修正后代码

import paramiko
import time

# 替换为路由器实际的登录账号密码
USERNAME = "admin"
PASSWORD = "your_router_password"
IP_FILE_PATH = "ip_address.txt"

# 读取IP列表,自动去除换行、空格,过滤空行
with open(IP_FILE_PATH, 'r', encoding='utf-8') as f:
    ip_list = [line.strip() for line in f.readlines() if line.strip()]

for ip in ip_list:
    ssh = None
    shell = None
    try:
        print(f"开始连接 {ip}")
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 增加连接超时,避免单个IP不通卡死整个流程
        ssh.connect(
            hostname=ip,
            port=22,
            username=USERNAME,
            password=PASSWORD,
            look_for_keys=False,
            timeout=10
        )
        print(f"成功连接 {ip}")

        shell = ssh.invoke_shell()
        # 等待登录欢迎语加载
        time.sleep(1)
        # 清空欢迎语缓存
        if shell.recv_ready():
            shell.recv(65535)

        # 执行查询命令
        shell.send("disp ip int brie\n")
        # 等待命令执行完成
        time.sleep(3)
        cmd_output = shell.recv(65535).decode("utf-8")
        print(f"设备 {ip} 接口信息输出:\n{cmd_output}")

        shell.send("quit\n")
        time.sleep(0.5)
    except Exception as e:
        print(f"处理设备 {ip} 出错:{str(e)}")
    finally:
        # 确保连接一定会被关闭
        if shell:
            shell.close()
        if ssh:
            ssh.close()
        print(f"已断开 {ip} 连接\n" + "-"*60)

优化建议

  • 固定sleep等待输出的方式稳定性较差,生产环境使用可以改为循环判断接收缓冲区状态,或者匹配输出末尾的设备命令提示符(如华为的< >/[ ]标识)判断命令是否执行完成
  • 如果需要执行配置类命令,每发送一条命令后建议等待1秒左右再发下一条,避免输入缓冲区溢出导致命令丢失
  • 确保ip_address.txt内每行仅填写一个IP地址,不要夹带多余注释、空格

内容的提问来源于stack exchange,提问作者Youcef SATOUR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:09:18