我正在使用check_output
进行所有的SSH和GitHub设置,并且尝试执行eval $(ssh-agent)
,以启动代理并在需要进程ID的情况下解析输出
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
我想知道是否没有适当地转义或修饰我的论点;如果有人看到我的错误,我将不胜感激!
答案 0 :(得分:0)
即使您设法解决了肤浅的语法问题,成功运行的子流程也可以简单地终止,而不会产生任何痕迹;它不会尝试(而且即使希望也不能)修改父Python进程的环境。这是常见的常见问题解答。
您可以在启动Python脚本的父进程中运行eval
,或者找出如何直接从Python与ssh-agent
通信的方法。它的输出通常是简单的变量分配序列,您可以自己解析。
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
的输出包含shell引用,则需要对其进行附加解析(基本上,将值字符串周围的引号括起来)。但这已经相当笨拙和脆弱,因此也许可以在启动Python之前恢复到在环境中设置qp,而不是试图将复杂性花在这种麻烦上。
更详细地讲,ssh-agent
和很少的其他Shell实用程序具有非常特殊的设计,以便它们能够与其父进程进行通信。正是由于子流程无法在其父流程的环境中进行任何更改,所以它打印一段代码供其父流程执行。默认情况下,它会打印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
语法打印类似的代码(这是一个历史悠久的shell,谢天谢地,不再使用它了),但是,遗憾的是,没有任何选项可以生成Python代码。 (本质上让ssh-agent
做到这一点并不困难。)
(上面的输出示例是从http://blog.joncairns.com/2013/12/understanding-ssh-agent-and-ssh-add/复制/粘贴的,其中包含完整的说明。)