使用Paramiko组合交互式shell和recv_exit_status方法

j7dteeu8  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(227)

我正在使用paramiko为SSH与我的远程设备。
我正在使用paramiko shell(invoke_shell()方法)与他们进行交互。
paramiko shell的主要问题(正如我在这里读到的许多答案)是不能保证paramiko SSHClient方法(指示服务器完成编写,如recv_exit_status()exit_status_ready())将按预期运行。
因此,我创建了一种机制,它将从shell读取输出的最后一行,并确定这一行是否只包含shell的提示符,在这种情况下,命令执行完成。
这是工作的情况下,有没有变化的提示
现在我在这里读到Wait until task is completed on Remote Machine through Python,'exec_command()'方法返回元组'stdin,stdout,stderr',执行stdout.channel.recv_exit_status()将阻塞通道,直到它完成。
我的问题是,如果我将创建这样一个元组,并将stdout.channel.recv_exit_status()stdout进行预成形,当我在每个交互命令上打开时,我将得到stdout(这意味着我将执行'shell_chan.send(' something ')',然后执行stdout.channel.recv_exit_status()),它会完成这项工作吗?只有当交互命令完成后才返回吗?

jqjz2hbq

jqjz2hbq1#

SSHClient.recv_exit_status表示 * 通道 * 已关闭。
“shell”通道仅在shell关闭时关闭。一个“shell”是一个有输入和输出的黑盒子。没别的了SSH,更不用说Paramiko,无论如何都无法告诉shell中的单个命令何时完成。shell_chan.send('something')不是SSH执行命令的信号。它只是向“shell”发送一个任意输入。没别的了如何解释输入完全取决于shell配置。SSH/Paramiko返回的只是一个任意的非结构化输出。帕拉米科无法为你解释。
如果你需要能够告诉一个命令何时完成,你需要使用“exec”通道(Paramiko中的SSHClient.exec_command方法)。你不应该使用“shell”通道,除非你正在实现一个交互式SSH终端客户端,比如PuTTY(或者在极少数情况下,当你与一个不实现“exec”通道的有限SSH服务器通信时,就像专用设备,比如路由器,交换机等)。
有关相关问题,请参阅:

相关问题