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数,你可以检查并调整:
- 登录设备执行以下命令查看当前配置:
show running-config | include ssh - 如果看到
ip ssh maxsessions数值较小(比如默认5),可以调大:
注意:此操作需要设备管理员权限,建议先和运维团队确认。config t ip ssh maxsessions 10 end write memory
内容的提问来源于stack exchange,提问作者Sivasubramanian Duraisami
相关产品推荐
相关产品推荐

