Несколько команд с ssh с использованием подпроцесса Python - PullRequest
0 голосов
/ 30 июня 2018

Мне нужно выполнить несколько команд оболочки в сеансе ssh с использованием модуля subprocess. Я могу выполнить одну команду одновременно с:

   subprocess.Popen(["ssh",  "-o UserKnownHostsFile=/dev/null", "-o StrictHostKeyChecking=no", "%s" % <HOST>, <command>])

Но есть ли способ выполнить несколько команд оболочки с subprocess в сеансе ssh? Если возможно, я не хочу использовать пакеты.

Большое спасибо!

1 Ответ

0 голосов
/ 30 июня 2018

Строго говоря, вы выполняете только одну команду с 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.

Я чувствую, что это излишне для большинства простых ситуаций, хотя первоначальное предложение является самым простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...