我正在编写一个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')