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

Paramiko操作Cisco ASR1006多命令无输出及单连接报错求助

解决Paramiko连接Cisco ASR1006多命令执行问题

这确实是Cisco IOS/IOS-XE设备(包括ASR1006)和Paramiko交互时的常见问题,我来帮你拆解原因和可行的解决办法:

问题根源分析

1. 分号分隔多命令失效的原因

Cisco设备的exec shell(也就是Paramiko默认exec_command调用的会话模式)不支持用分号分隔多个命令。这种模式是一次性的:启动会话→执行单条命令→关闭会话,完全不同于我们手动登录时的交互式shell,所以多命令拼接会直接失效。

2. 单连接多次exec_command触发EOFError的原因

每次调用exec_command都会在SSH连接下新建一个channel,而部分Cisco设备对单SSH连接的并发channel数有严格限制,或者前一个channel没有被正确释放,导致后续尝试新建channel时触发EOF错误。


解决方法

方法一:使用交互式shell(最推荐)

模拟人工登录的交互流程,用invoke_shell替代exec_command,这是适配Cisco设备最稳定的方式,天然支持多命令执行:

import paramiko
import time

login_user = 'xyz'
login_pass = 'xyz'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(device, username=login_user, password=login_pass, look_for_keys=False, timeout=5)

# 启动交互式shell会话
shell = ssh.invoke_shell()
# 等待设备加载提示符(可根据设备响应速度调整sleep时长)
time.sleep(2)

# 发送命令,注意末尾必须加换行符模拟回车
shell.send('term len 0\n')
time.sleep(1)
shell.send('show int desc | i Tu\n')
time.sleep(2)
shell.send('show ip interface brief | in Tunnel\n')
time.sleep(2)
shell.send('show ip bgp vpnv4 vrf AWS summary | i 169.25\n')
time.sleep(3)
shell.send('show ip route vrf AWS bgp\n')
time.sleep(3)

# 读取所有输出(可根据输出大小调整recv的字节数)
all_output = shell.recv(65535).decode('utf-8')
print(all_output)

ssh.close()

优化提示:固定time.sleep不够灵活,你可以写个循环检测输出中是否出现设备提示符(比如#或>),确认命令执行完成后再发送下一条,避免等待过长或过短。

方法二:手动释放channel资源(兼容exec_command)

如果坚持使用exec_command,每次执行后务必手动关闭对应的stdin/stdout/stderr,释放channel资源:

import paramiko

login_user = 'xyz'
login_pass = 'xyz'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(device, username=login_user, password=login_pass, look_for_keys=False)

# 执行第一条命令并释放资源
stdin, stdout, stderr = ssh.exec_command('show int desc | i Tu')
vpc_ints = stdout.read().decode('utf-8')
stdin.close()
stdout.close()
stderr.close()

# 执行第二条命令并释放资源
stdin, stdout, stderr = ssh.exec_command('show ip interface brief | in Tunnel')
vpc_peers = stdout.read().decode('utf-8')
stdin.close()
stdout.close()
stderr.close()

# 后续命令重复上述流程...

ssh.close()

方法三:调整设备SSH会话限制(需设备权限)

部分Cisco设备默认限制了单SSH连接的最大channel数,你可以检查并调整:

  1. 登录设备执行以下命令查看当前配置:
    show running-config | include ssh
    
  2. 如果看到ip ssh maxsessions数值较小(比如默认5),可以调大:
    config t
    ip ssh maxsessions 10
    end
    write memory
    
    注意:此操作需要设备管理员权限,建议先和运维团队确认。

内容的提问来源于stack exchange,提问作者Sivasubramanian Duraisami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:56:16