Запуск команд на сервере через локальный скрипт Python - PullRequest
0 голосов
/ 28 октября 2019

Я хотел бы запустить пакет команд bash (все вместе) в оболочке сервера через скрипт python3 на моей локальной машине. Причина, по которой я не запускаю скрипт python3 на своем ноутбуке, заключается в том, что я не могу создать ту же среду на сервере и хочу сохранить настройки, которые есть на моем компьютере, во время выполнения скрипта. То, что я хотел бы сделать: -Локально запускать команды Python -Работать в определенный момент эти команды на сервере -Дождаться окончания выполнения сервера -Продолжить запуск сценария Python (это будет сделано в цикле)

Я пытаюсь поместить все команды в сценарий bash ssh_commands.sh и использовать следующую команду:

subprocess.call('cat ssh_commands.sh | ssh -T -S {} -p {} {}'.format(socket, port, user_host).split(),shell=True)

Но когда выполнение сценария достигает этой строки, застряли до subprocess.call тайм-аут. Выполнение сценария в любом случае не займет так много времени. Единственный способ остановить сценарий до этого - через Ctrl+C

Я также пытался установить ssh-соединение в файле ~/.ssh/config, но получаю тот же результат.

Я знаю, что ssh-соединение работает нормально, и если я запускаю ssh_commands.sh на сервере вручную, оно запускается без проблем.

Может кто-нибудь предложить: - Способ исправить то, что я пытаюсь сделать - Aлучший способ достижения конечного результата, описанный выше - некоторый способ отладки, чтобы выяснить, в чем может быть проблема Заранее спасибо

1 Ответ

0 голосов
/ 28 октября 2019

Чтобы расширить мой комментарий - и я не проверял ваш конкретный случай с ssh, могут быть и другие осложнения). Это на самом деле копирование / вставка из моего собственного кода в ситуации, которая, как я уже знаю, работает.

from subprocess import Popen, PIPE, DEVNULL
from shlex import split as sh_split

proc1 = Popen(sh_split(file_cmd1), stdout=PIPE)
proc2 = Popen(file_cmd2, shell=True, stdin=proc1.stdout, stdout=PIPE)
proc1.stdout.close()

У меня есть конкретная причина использовать shell=True во втором, но вы, вероятно, сможете использоватьshlex.split там тоже, я догадываюсь.

По сути, вы запускаете одну команду, выводите в `PIPE´, а затем используете ее в качестве ввода для второй команды.

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