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
相关产品推荐
相关产品推荐

