【问题标题】:Combining interactive shell and recv_exit_status method using Paramiko使用 Paramiko 结合交互式 shell 和 recv_exit_status 方法
【发布时间】:2019-12-29 19:10:35
【问题描述】:

我在远程设备上使用 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 预先形成,当我打开每个交互式命令时我会得到(这意味着我将执行'shell_chan.send('something')'然后会做stdout.channel.recv_exit_status()) 它会完成这项工作吗?只有在交互命令完成后才会返回?

【问题讨论】:

    标签: python shell ssh paramiko interactive


    【解决方案1】:

    SSHClient.recv_exit_status 表示 频道 已关闭。

    “shell”通道仅在 shell 关闭时关闭。 “外壳”是一个带有输入和输出的黑盒子。没有其他的。无论如何,当 shell 中的单个命令完成时,SSH 无法告诉,只有 Paramiko。 shell_chan.send('something') 不是向 SSH 发出执行命令的信号。它只是将任意输入发送到“shell”。没有其他的。如何解释输入完全取决于 shell 配置。 SSH/Paramiko 得到的只是任意的非结构化输出。 Paramiko 无论如何都无法为您解释。


    如果您需要能够判断命令何时完成,则需要使用“exec”通道(Paramiko 中的SSHClient.exec_command 方法)。您不应该使用“shell”通道,除非您正在实现交互式 SSH 终端客户端,如 PuTTY(或者在极少数情况下,当您与未实现“exec”通道的受限 SSH 服务器通信时,因为它通常专用设备,如路由器、交换机等)。


    相关问题见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2013-04-16
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多