paramiko实现SSH交互式命令执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paramiko实现SSH交互式命令执行相关的知识,希望对你有一定的参考价值。

参考技术A

需要批量在路由器上进行配置,与网元建立SSH连接,同时存在交互操作。比如:键入 Configure ,进入配置模式成功后才可以键入后续指令。

在这个过程中遇到很多坑,在此分享。

SSHClient是最简单的命令行执行方式,简单的参数填写,优雅的结果处理,这很难不让人赶紧上手一试。

但遗憾的是 SSHClient不支持交互式命令执行 ,其原因在于其 exec_command 方法每次执行一条命令都会开启一个新的“channel”,从而开启一个新的session,这相当于我们每执行一次命令,都重新登录了一次网元设备,这使得交互式无从谈起。

所以我们要创建固定channel,从而创建固定session

以上是交互式连接的过程,但事情并不是一帆风顺的,在这个过程中还有两个问题,这两个问题都由交互结果获取函数 channel.recv 引起,这将导致。

以上是 channel.recv 的实现过程,归根结底还是 _ssl_io_loop 这个函数会递归的获取ssh交互结果,形成一种循环。这种循环的结束条件就是接受到交互结果,或者是结果读取异常。

如果我们在执行命令之后立刻获取结果,交互可能尚未产生结果,获取失败,结束循环(接收无效), channel.recv 仿佛没有执行一样。

这时我们就会想到,既然交互结果的获取具有滞后性,那我们就编写逻辑,使其等待或者循环等待。

这就会引发下一个问题,如果我们循环调用 channel.recv 时,必须在获取到交互结果后结束我们的循环,不论这个交互的结果是不是你期望的;否则会进入死循环,程序无法推进。

以上是关于paramiko实现SSH交互式命令执行的主要内容,如果未能解决你的问题,请参考以下文章

python 通过paramiko模块批量执行ssh命令

paramiko模块实现批量执行远程主机命令

Python Paramiko实现sftp文件上传下载以及远程执行命令

远程执行命令:paramiko

python paramiko ssh登录思科交换机执行命令多条命令问题

pexpect模块