Строго говоря, вы выполняете только одну команду с Popen
независимо от того, сколько команд вы выполняете на удаленном сервере. Эта команда ssh
.
Чтобы несколько команд выполнялись на удаленном сервере, просто передайте их в строке command
, разделенной ;
s:
commands = ["echo 'hi'", "echo 'another command'"]
subprocess.Popen([
"ssh",
"-o UserKnownHostsFile=/dev/null",
"-o StrictHostKeyChecking=no",
";".join(commands)
])
Вы также можете присоединиться к командам на &&
, если хотите, чтобы каждая команда выполнялась только в том случае, если предыдущая команда была выполнена успешно.
Если у вас много команд и вы обеспокоены тем, что вы можете превысить пределы командной строки , вы можете выполнить sh
(или bash) с параметром -s
на удаленном сервере, который будет выполняйте команды одну за другой по мере их отправки:
p = subprocess.Popen([
"ssh",
"-o UserKnownHostsFile=/dev/null",
"-o StrictHostKeyChecking=no",
"sh -s",
], stdin=subprocess.PIPE)
for command in commands:
p.stdin.write(command)
p.stdin.write("\n")
p.flush()
p.communicate()
Обратите внимание, что в Python3 вам нужно будет закодировать команду в байтовую строку (command.encode("utf8")
) перед записью ее в stdin
из subprocess
.
Я чувствую, что это излишне для большинства простых ситуаций, хотя первоначальное предложение является самым простым.