Как использовать sshkey с подпроцессом - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь подключиться к маршрутизатору через ssh и записать команду в оболочку. Я думаю, что соединение работает, потому что я получаю пустой вывод, а не сообщение об ошибке. Я знаю, что мне нужно использовать ключевой файл, чтобы действительно подключиться к устройству. Может быть, это причина того, что вывод пуст.

Это мой код:

mykey = os.path.expanduser('C:\\Users\\taaiaal1\\PycharmProjects\\hal_dmms_application\\dev_ssh')
command = 'pcb_cli -u cwmpd pcb://ipc:[/var/run/IGD] -i \'?\''

ssh = subprocess.Popen(["ssh", username + '@' + host + ':' + port, command],
                       shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
print(result)

Где мне интегрировать ключевой файл?

Я чувствую, что проверил каждую страницу, google позволил мне найти, и даже в документации по подпроцессу python я ничего не смог найти. Это вообще возможно? Я использую Python 3.

Ответы [ 3 ]

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

Попробуйте:

ssh = subprocess.Popen(["ssh", "-i", "/path/to/key", username + '@' + host + ':' + port, command],
                       shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)

Попен ожидает массив аргументов, отформатированных определенным образом. Самый простой способ получить правильную таблицу arg - это сделать так:

command = "ssh -i my.key user@host"
args = command.split(' ')
ssh = subprocess.Popen(args)
0 голосов
/ 27 июня 2018

Некоторые указатели:

  • Прежде всего порт не указывается после :, он предоставляется с параметром -p
  • Если ключ требуется, вы должны указать его, используя опцию -i. Убедитесь, что разрешения для ключа 0400.
  • Вы даете удаленную команду в виде списка, а также указываете shell=True, что в некотором роде исключает друг друга. Если вы хотите использовать shell = True, тогда вы даете команду как одну строку.

  • Если вы хотите собрать выходные данные удаленной команды, просто используйте subprocess.check_output . Он использует функцию popen () по своей сути, но предоставляет вам более простой интерфейс. Не забудьте попробовать / исключить функцию, так как она вызывает исключение, если что-то пошло не так с самим ssh или состояние выхода удаленной команды отличное от нуля.

Ваш код может выглядеть так:

try:
    out = subprocess.check_ouptput(["ssh", "-i", "<path to your key>", "-p", "<port number>", "{}@{}".format(user, host), command])
    print(out)
except CalledProcessError as e:
...

Посмотрите на мою реализацию выполнения удаленных команд, если вы хотите увидеть некоторые полезные практики для выполнения удаленных команд.

PS: Существует два различных способа использования функций подпроцесса: один, для которого требуется оболочка для выполнения вашей команды, например, если удаленная команда имеет подстановочный знак (ls * .txt) ИЛИ ваша удаленная команда делает не требует оболочки, например, для выполнения uname -a. Пожалуйста, посмотрите на ссылку документации подпроцесса выше.

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

Используйте флаг -i, чтобы указать файл идентификации. См. Руководство ssh в файле identity_file

.

В вашем примере это будет

ssh = subprocess.Popen(["ssh","-i "+mykey, username + '@' + host + ':' + port, command],
                   shell=True,
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE)

Для Python также доступны высокоуровневые библиотеки SSH.

...