Paramiko:连接Cisco C2960交换机时未能重用ssh会话

1 投票
2 回答
2108 浏览
提问于 2025-04-17 06:25

我正在尝试写一个简单的脚本来连接Cisco C2960交换机。但是我就是搞不懂怎么重复使用ssh会话来执行超过两个命令。

在StackOverflow上有个讨论,
关于持久化ssh会话到Cisco路由器
但那里的答案都无法解决我的问题。

这是我的代码:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('xxx',username='xxx',password='xxx',allow_agent=False)
stdin, stdout, stderr = ssh.exec_command('show version')
stdin, stdout, stderr = ssh.exec_command('sh mac brief')

结果是:

Traceback (most recent call last):
  File "./test.py", line 10, in <module>  
    stdin, stdout, stderr = ssh.exec_command('sh mac brief')
  File "/usr/lib/python2.6/site-packages/paramiko/client.py", line 363, in exec_command
    chan = self._transport.open_session()
  File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 658, in open_session
    return self.open_channel('session')
  File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 746, in open_channel
    raise e
EOFError

2 个回答

0

我在提到的那个StackOverflow问题上回答过这个,不过你有没有试过用 invoke_shell() 呢?

我看到很多人反映,有些思科设备只允许执行一个命令后就关闭连接(不过这个设置可能在设备的某个地方可以调整)。在这种情况下,你需要启动一个shell,然后进行交互式操作(或者像用pexpect那样进行伪交互),或者创建一个脚本,把命令作为一个整体发送出去。

1

使用invoke_shell()函数在与Cisco IOS进行交互时效果最好。我尝试过paramiko中的其他函数,但它们都出现了奇怪的EOF文件错误。

撰写回答