使用 Paramiko 结合交互式 shell 和 recv_exit_status 方法
Combining interactive shell and recv_exit_status method using Paramiko
我在远程设备上使用 paramiko 进行 SSH。
我正在使用 paramiko shell(invoke_shell()
方法)与他们进行交互以进行交互。
paramiko shell 的主要问题(正如我在这里阅读的许多答案)是不能保证 paramiko SSHClient 方法指示服务器完成写入,例如 recv_exit_status()
和 exit_status_ready()
将按预期运行。
所以我创建了一种机制,它将读取 shell 输出的最后一行,并确定该行是否仅包含 shell 的提示,在这种情况下命令执行已完成。
如果提示没有变化,这是可行的。
现在我在这里 读到 'exec_command()' 方法 return 元组 'stdin, stdout, stderr' 和执行 stdout.channel.recv_exit_status()
将阻塞通道,直到它完成。
我的问题是我是否会创建这样一个元组并将 stdout.channel.recv_exit_status()
与 stdout
一起预制,当我打开每个交互式命令时我会得到(这意味着我会做 'shell_chan.send('something')' 然后会做 stdout.channel.recv_exit_status()
) 它会完成这项工作吗?它会 return 仅当交互式命令完成时吗?
SSHClient.recv_exit_status
表示 通道 已关闭。
“shell”通道仅在 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 服务器交谈时,因为通常情况下使用专用设备,例如路由器、交换机等)。
相关问题请见:
- Use the same SSH object to issue "exec_command()" multiple times in Paramiko
- Execute (sub)commands in secondary shell/command on SSH server in Paramiko
- Invoke multiple commands inside a process in interactive ssh mode
我在远程设备上使用 paramiko 进行 SSH。
我正在使用 paramiko shell(invoke_shell()
方法)与他们进行交互以进行交互。
paramiko shell 的主要问题(正如我在这里阅读的许多答案)是不能保证 paramiko SSHClient 方法指示服务器完成写入,例如 recv_exit_status()
和 exit_status_ready()
将按预期运行。
所以我创建了一种机制,它将读取 shell 输出的最后一行,并确定该行是否仅包含 shell 的提示,在这种情况下命令执行已完成。
如果提示没有变化,这是可行的。
现在我在这里 stdout.channel.recv_exit_status()
将阻塞通道,直到它完成。
我的问题是我是否会创建这样一个元组并将 stdout.channel.recv_exit_status()
与 stdout
一起预制,当我打开每个交互式命令时我会得到(这意味着我会做 'shell_chan.send('something')' 然后会做 stdout.channel.recv_exit_status()
) 它会完成这项工作吗?它会 return 仅当交互式命令完成时吗?
SSHClient.recv_exit_status
表示 通道 已关闭。
“shell”通道仅在 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 服务器交谈时,因为通常情况下使用专用设备,例如路由器、交换机等)。
相关问题请见:
- Use the same SSH object to issue "exec_command()" multiple times in Paramiko
- Execute (sub)commands in secondary shell/command on SSH server in Paramiko
- Invoke multiple commands inside a process in interactive ssh mode