我正在用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会话中发送多个命令,并能够知道命令执行的结束?
谢啦,谢啦
1条答案
按热度按时间w8rqjzmb1#
看起来您想要实现一个交互式shell,但您需要控制单个命令的执行。这是不可能的,只有SSH接口。SSH中的“shell”通道是一个带有输入和输出的黑盒。所以在Paramiko没有什么可以帮助你实现这一点。
如果您需要了解特定命令何时结束或特定命令的输出在何处结束,则需要使用shell的功能。
您可以通过在两者之间插入一个唯一的分隔符(字符串)并在通道输出流中搜索它来解决这个问题。对于一个普通的 *nix shell,可以这样工作:
字符串
不过,我觉得你并不经常需要这个。使特定命令工作所需的大多数命令,如
cd
或set
,实际上并不输出任何东西。所以在大多数情况下,你可以使用
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的