我正在用Python编写一个程序,该程序必须通过SSH与物理目标进行通信,并自动将一些命令发送到该目标(用于测试)。
我首先使用Paramiko进行此操作,然后一切都非常完美,直到我必须发送几个命令,并且例如当第二个命令必须在第一个命令的上下文中执行时(例如,第一个命令执行,cd /mytargetRep第二个命令是./executeWhatIWant)。我不能exec_command这样做,因为每个人都exec_command开始一个新的会话。
cd /mytargetRep
./executeWhatIWant
exec_command
我尝试使用带有的通道invoke_shell(),但是与此相关的另一个问题是:我不知道通过此操作何时结束命令执行。我可以执行一些非常短的(及时的)命令执行,而其他一些实际上要更长一些,因此我需要知道命令执行何时结束。
invoke_shell()
我知道可以exec_command与shell逻辑操作(例如&&或using)一起使用的解决方法;。例如exec_command("cd /mytargetRep && ./executeWhatIWant")。但是我不能这样做,因为还必须可以手动执行一些命令(我有一个可以发送命令的极简终端),因此,例如,用户将执行cd /mytargetRepthen./executeWhatIWant而不是cd /mytargetRep && ./executeWhatIWant。
&&
;
exec_command("cd /mytargetRep && ./executeWhatIWant")
cd /mytargetRep && ./executeWhatIWant
所以我的问题是:是否有使用Paramiko在同一SSH会话中发送多个命令并能够知道命令执行结束的解决方案?
谢谢
似乎您想实现一个交互式外壳,但是您需要控制单个命令的执行。仅使用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')
尽管我并不是真的认为您经常需要它。使特定命令正常工作所需的大多数命令(例如cd或)set实际上不会输出任何内容。
cd
set
因此,在大多数情况下,您可以使用SSHClient.exec_command并且您的代码将更简单,更可靠: 在Paramiko中执行多个命令,以使命令受其前辈的影响
SSHClient.exec_command
即使您需要使用看起来像su/的复杂对象sudo,还是最好坚持使用SSHClient.exec_command: 使用Python在SSH中使用“ su -l”执行命令
su
sudo