Невозможно S SH через Python подпроцесс - PullRequest
0 голосов
/ 31 января 2020

Мне нужно s sh в машину через бастион. Поэтому команда довольно длинная для этого:

ssh -i  <pemfile location> -A -o 'proxycommand ssh -i <pemfile location> ec2-user@<bastion ip address> -W %h:%p' hadoop@<machine ip>

Эта команда довольно длинная. Поэтому я попытался написать скрипт python, который принимает IP-адреса и местоположение pemfile в качестве входных данных и выполняет s sh.

#!/usr/local/bin/python3
import argparse
import subprocess
import os
import sys
import errno

parser = argparse.ArgumentParser(description="Tool to ssh into EMR via a bastion host")
parser.add_argument('master', type=str, help='IP Address of the EMR master-node')
parser.add_argument('bastion', type=str, help='IP Address of bastion EC2 instance')
parser.add_argument('pemfile', type=str, help='Path to the pemfile')

args = parser.parse_args()

cmd_list = ["ssh", "-i", args.pemfile, "-A", "-o", "'proxycommand ssh -i {} ec2-user@{} -W %h:%p'".format(args.pemfile, args.bastion), "hadoop@{}".format(args.master)]

command = ""

for w in cmd_list:
    command = command + " " + w

print("")
print("Executing command : ", command)
print("")

subprocess.call(cmd_list)

При запуске этого сценария появляется следующая ошибка:

command-line: line 0: Bad configuration option: 'proxycommand

Но я могу выполнить точную команду через bash.

Почему скрипт s sh из python не работает тогда?

1 Ответ

2 голосов
/ 31 января 2020

Вы делаете (распространенную) ошибку, смешивая цитаты syntacti c с буквальными кавычками. В командной строке оболочка удаляет все кавычки перед передачей строки команде, которую вы запускаете; Вы должны просто сделать то же самое.

cmd_list = ["ssh", "-i", args.pemfile, "-A",
    "-o", "proxycommand ssh -i {} ec2-user@{} -W %h:%p".format(
        args.pemfile, args.bastion), "hadoop@{}".format(args.master)]

См. также Когда обернуть кавычки вокруг переменной оболочки? для обсуждения того, как работает цитирование в оболочке, и, возможно, Actual значение 'shell = True' в подпроцессе в качестве отправной точки для стороны Python.

Однако создание сценариев интерактивных сеансов S SH будет хрупким; Я рекомендую вам поискать подходящую библиотеку Python, например, Paramiko, для подобных вещей.

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