Даже если вам удалось исправить поверхностные синтаксические проблемы, подпроцесс, который успешно выполняется, просто завершается без трассировки;он не пытается (и не может, даже если бы захотел) изменить среду родительского процесса 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/, который содержит более полное объяснение.)