Удаленное выполнение сценариев python с использованием API и подпроцесс не работает - PullRequest
0 голосов
/ 08 января 2020

У меня есть скрипт python (назовем его script1.py), который использует модуль exe cnet для удаленного запуска другого скрипта (script2.py) на другом компьютере. Важная часть этого выглядит примерно так:

import script2
host = "name@ip"
gw = execnet.makegateway("ssh={}".format(host))
channel = gw.remote_exec(script2)

Не имеет значения, что он делает, потому что, когда я запускаю его в терминале, он работает отлично. Сейчас я пытаюсь запустить его через Flask API. Я использую модуль подпроцесса для запуска нового процесса со скриптом (прекрасно работает с любым другим скриптом, который не требует подключения к другой машине). По сути, это должно работать так:

отправка запроса на запуск скрипта -> создание подпроцесса с помощью script1.py -> внутри script1.py, импортирование script2 и запуск его на другой машине с использованием exe cnet

Когда я делаю это, я получаю сообщение об ошибке:

 ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
 Permission denied, please try again.
 ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
 Permission denied, please try again.
 ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
 Permission denied (publickey,password).
 Traceback (most recent call last): File "/home/ubuntu/script1.py", line 23, in <module>
 gw = execnet.makegateway("ssh={}".format(host)) File "/usr/local/lib/python2.7/dist-packages/execnet/multi.py",
 line 128, in makegateway gw = gateway_bootstrap.bootstrap(io, spec) 
 File "/usr/local/lib/python2.7/dist-packages/execnet/gateway_bootstrap.py",
 line 98, in bootstrap bootstrap_exec(io, spec) File "/usr/local/lib/python2.7/dist-packages/execnet/gateway_bootstrap.py",
 line 50, in bootstrap_exec raise HostNotFound(io.remoteaddress) execnet.gateway_bootstrap.HostNotFound: remote@10.10.1.2

Странно, что я могу сделать это в linux терминале, но не запуская его как подпроцесс с API. У кого-нибудь есть идеи, почему он не работает?

1 Ответ

0 голосов
/ 08 января 2020

Похоже, вам нужно ввести пароль, когда вы ssh на удаленном хосте. Хотя с терминала это работает нормально, когда вы пытаетесь выполнить ту же команду под flask, у него нет никакого способа запросить у вас пароль.

Он пытается использовать ssh-askpass команда, которую можно использовать для вызова диалогового окна, в котором вы можете ввести пароль; это часто используется в GUI средах, где вы можете запускать ssh без пароля. Однако это не совсем подходящее решение для того, что вы делаете, потому что в идеале вам не нужно вручную взаимодействовать с вашим кодом каждый раз, когда требуется аутентификация.

Типичное решение этой проблемы - использование аутентификации на основе ключей s sh: создайте пару открытых / закрытых пар ключей для использования вашим приложением, поместите ключ publi c в соответствующий файл authorized_keys на удаленном хосте и убедитесь, что при Python код порождает соединение s sh, в котором используется соответствующий файл ключа.


Кстати, документация для execnet гласит:

exe cnet в настоящее время находится в режим только для обслуживания, в основном потому, что он все еще является бэкендом плагина pytest-xdist. Не использовать в новых проектах.

...