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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Paramiko单独执行多个相关命令,并找出每个命令何时完成相关的知识,希望对你有一定的参考价值。

我正在编写一个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 shell,这样的工作:

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

以上是关于使用Paramiko单独执行多个相关命令,并找出每个命令何时完成的主要内容,如果未能解决你的问题,请参考以下文章

Paramiko和MySQL相关-day10

Python模块之paramiko

paramiko模块与 StringIO模块

远程执行命令:paramiko

Python paramiko 模块

python的paramiko模块