Python check_output вызов eval (с аргументами) завершается неудачно - PullRequest
0 голосов
/ 27 декабря 2018

Я использую check_output, чтобы выполнить все мои настройки SSH и GitHub, и пытаюсь выполнить eval $(ssh-agent), чтобы запустить агент и проанализировать вывод, если мне нужен идентификатор процесса.

from subprocess import check_output

out = check_output(["eval", "$(ssh-agent)"])
print(out)

Но независимо от того, как я избегаю вещей, я получаю одну и ту же ошибку.

Traceback (most recent call last):
  File "gitSetup.py", line 3, in <module>
    out = check_output(["eval", "$(ssh-agent)"])
  File "/usr/lib/python2.7/subprocess.py", line 216, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Мне интересно, не ухожу ли я или не урезал ли мои аргументы правильно;если кто-то увидит мою ошибку, я буду признателен за понимание!

1 Ответ

0 голосов
/ 27 декабря 2018

Даже если вам удалось исправить поверхностные синтаксические проблемы, подпроцесс, который успешно выполняется, просто завершается без трассировки;он не пытается (и не может, даже если бы захотел) изменить среду родительского процесса Python.Это часто задаваемые вопросы.

Вы можете запустить eval в родительском процессе, который запускает ваш скрипт Python, или, возможно, выяснить, как связаться с ssh-agent напрямую из Python.Его вывод, как правило, представляет собой простую последовательность присвоений переменных, которую вы можете проанализировать самостоятельно.

from subprocess import check_output
from os import environ

eval_string = check_output(['ssh-agent'])
for line in eval_string.rstrip('\n').split('\n'):
    for expr in line.rstrip(';').split(';'):
        if expr.startswith((' export ', 'echo ')):
            continue
        var, value = expr.strip().split('=', 1)
        environ[var] = value

Если вывод из ssh-agent содержит кавычки оболочки, вам потребуется выполнить дополнительный анализ (в основном,кавычки вокруг строки значения).Но это уже довольно неуклюже и хрупко, поэтому, возможно, вернитесь к установке qp среды перед запуском Python, вместо того, чтобы пытаться внести некоторую изощренность в этот кладж.

Более подробно, ssh-agent и несколько драгоценных других оболочекУтилиты имеют очень специфический дизайн, чтобы они могли общаться со своим родительским процессом.Именно потому, что подпроцесс не может вносить какие-либо изменения в среду своего родительского процесса, он вместо этого печатает фрагмент кода для выполнения его родительским процессом.По умолчанию он печатает sh код, подобный следующему:

SSH_AUTH_SOCK=/tmp/ssh-MUyniqn10506/agent.10506; export SSH_AUTH_SOCK;
SSH_AGENT_PID=10507; export SSH_AGENT_PID;
echo Agent pid 10507;

Также есть возможность напечатать аналогичный код в синтаксисе csh (это историческая оболочка, которая, к счастью, используется не очень часто).больше) но, увы, нет возможности для создания кода Python.(Нетрудно заставить ssh-agent сделать это, по сути.)

(Вышеприведенный пример выходной копии / вставлен из http://blog.joncairns.com/2013/12/understanding-ssh-agent-and-ssh-add/, который содержит более полное объяснение.)

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