Paramiko:连接Cisco C2960交换机时未能重用ssh会话
我正在尝试写一个简单的脚本来连接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文件错误。