Подпроцесс Python для выполнения команд удаленного сервера - PullRequest
0 голосов
/ 01 октября 2018

Я должен выполнить скрипт python, который находится на удаленной машине, и я использую следующий скрипт:

from subprocess import call
ip = 1.1.1.1
call(["ssh", ip, "\"cd scripts; python -u get_details.py --web_server\""])

, получая ошибку ниже:

bash: cd scripts; python -u get_details.py --web_server: command not found

, работающий непосредственно в командной строке bash:

 ssh 1.1.1.1 "cd scripts; python -u get_details.py --web_server"

Запрашиваемая ниже ввода и возврата вывода

 1. USA
 2. UK
 Choose input: 1

 www.cisco_us.com is up 

Пожалуйста, позвольте мне исправить или любой другой лучший способ добиться этого в Python

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Чтобы убедиться, что ваши аргументы всегда подготовлены правильно, используйте модуль shlex в python.Вы можете сделать следующее:

import shlex
import subprocess

ip = '1.1.1.1'
cmd = "ssh {} 'cd scripts; python -u get_details.py --web_server'".format(ip)

subprocess.call(shlex.split(cmd))

Это гарантирует, что ваши аргументы правильно подготовлены.


Я также рекомендую вам взглянуть на Paramiko ,Это библиотека Python, которая помогает вам управлять SSH-соединениями.

0 голосов
/ 01 октября 2018

Вам необходимо удалить кавычки, потому что оболочка удаляет их.Это:

ssh 1.1.1.1 "cd scripts; python -u get_details.py --web_server"

эквивалентно:

call(["ssh", ip, "cd scripts; python -u get_details.py --web_server"])

Если вы используете call таким образом, на стороне клиента не будет задействована оболочка (что хорошо),только на стороне сервера.

...