使用 Paramiko 单独执行多个相关命令并找出每个命令何时完成

Execute multiple dependent commands individually with Paramiko and find out when each command finishes

我正在 Python 中编写一个程序,它必须通过 SSH 与物理目标进行通信,并自动向该目标发送一些命令(用于测试)。

我首先使用 Paramiko 执行此操作,一切都很完美,直到我必须发送多个命令,例如第二个必须在第一个的上下文中执行(例如第一个使 cd /mytargetRep,第二个是 ./executeWhatIWant)。我不能使用 exec_command 这样做,因为每个 exec_command 都会启动一个新会话。

我尝试使用带有 invoke_shell() 的通道,但我还有另一个问题:我不知道这样做何时结束命令执行。我可以执行一些非常短(及时)的命令,而其他一些确实更长,所以我需要知道命令执行何时结束。

我知道一个解决方法是使用 exec_command 和 shell 逻辑运算,例如 && 或使用 ;。例如 exec_command("cd /mytargetRep && ./executeWhatIWant")。但是我不能那样做,因为它也必须可以手动执行一些命令(我有一个可以发送命令的极简终端),所以例如,用户将 cd /mytargetRep 然后 ./executeWhatIWant 而不是 cd /mytargetRep && ./executeWhatIWant.

所以我的问题是:是否有解决方案,使用 Paramiko 在同一个 SSH 会话中发送多个命令,并能够知道命令执行的结束?

谢谢

看来你想实现一个交互shell,但你需要控制个别命令的执行。仅仅使用 SSH 接口是不可能的。 SSH 中的“shell”通道是带有输入和输出的黑盒子。所以 Paramiko 中没有任何东西可以帮助你实现这个。

如果您需要查明特定命令何时完成或特定命令的输出在何处结束,则需要使用 shell.

的功能

您可以通过在中间插入一个唯一的分隔符(字符串)并在频道输出流中搜索它来解决这个问题。使用常见的 *nix shells 类似这样的东西:

channel = ssh.invoke_shell()
channel.send('cd /mytargetRep\n')
channel.send('echo unique-string-separating-output-of-the-commands\n')
channel.send('./executeWhatIWant\n')

虽然我真的不认为你经常需要它。使特定命令工作所需的大多数命令,如 cdset,实际上不会输出任何内容。

因此在大多数情况下您可以使用 SSHClient.exec_command 并且您的代码将更加简单和可靠:
Execute multiple commands in Paramiko so that commands are affected by their predecessors

即使你需要使用像su/sudo这样看似复杂的东西,最好还是坚持使用SSHClient.exec_command:


类似问题请见:

  • (对于“shell”频道)