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

xghobddn  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(154)

我正在用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会话中发送多个命令,并能够知道命令执行的结束?
谢啦,谢啦

w8rqjzmb

w8rqjzmb1#

看起来您想要实现一个交互式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')

字符串
不过,我觉得你并不经常需要这个。使特定命令工作所需的大多数命令,如cdset,实际上并不输出任何东西。
所以在大多数情况下,你可以使用SSHClient.exec_command,你的代码会更简单,更可靠:
Execute multiple commands in Paramiko so that commands are affected by their predecessors
即使你需要使用一些看起来很复杂的东西,比如su/sudo,最好还是坚持使用SSHClient.exec_command
Executing command using "su -l" in SSH using Python
有关类似问题,请参见:
Combining interactive shell and recv_exit_status method using Paramiko

相关问题