使用Paramiko结合交互式Shell和recv_exit_status方法

4
我正在使用paramiko进行SSH与远程设备的通信。我使用paramiko shell(invoke_shell()方法)进行交互。
paramiko shell的主要问题是(据我在这里阅读的许多答案),不能保证像recv_exit_status()exit_status_ready()这样指示服务器完成写入的paramiko SSHClient方法会按预期运行。
因此,我创建了一个机制来读取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(),那么它会做到这一点吗?它会在交互式命令结束时返回吗?
1个回答

4

SSHClient.recv_exit_status 表示 通道 已关闭。

"shell" 通道仅在 shell 关闭时才会关闭。"shell" 是一个具有输入和输出的黑盒子。没有其他东西。SSH,更不用说 Paramiko,无论如何都无法知道 shell 中的单个命令何时完成。 shell_chan.send('something') 不是向 SSH 发送 执行命令 的信号。它只是将任意输入发送到 "shell"。没有其他东西。由 shell 自行决定如何解释输入。SSH/Paramiko 只会收到任意的非结构化输出。Paramiko 无法为您解释它。


如果你需要能够判断命令何时完成,你需要使用"exec"通道(Paramiko中的SSHClient.exec_command方法)。除非你正在实现一个交互式SSH终端客户端(如PuTTY),否则不应该使用"shell"通道(或者在某些罕见情况下,当你与不支持"exec"通道的特定设备(如路由器、交换机等)进行通信时)。

有关问题,请参见:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接