为了运行ssh-agent,我必须使用:
eval $(ssh-agent)

为什么必须evalssh-agent的输出?为什么我不能直接运行它?

评论

谁说您必须使用eval?是什么决定了这一点?多一点上下文会有所帮助。

help.github.com/articles/…

@ 0xSheepdog手册页,开始...

看起来用例记录在手册页中。至于“为什么要设计某种方式” ...耸耸肩。

重申一下,不是“按这种方式设计”的ssh-agent,而是unix / linux,因为ssh-agent在外壳程序的子进程中运行。子进程不能修改父进程。但是一个函数可以:因为它在当前进程中运行。因此,您可以编写一个函数:do_set_ssh_agent(){eval ssh-agent; }可以简单地运行为:$ do_set_ssh_agent。但是“程序”并没有(通常)在linux / unix中作为“功能”安装。而是将程序作为文件安装,如上所述,这些文件在子进程中运行。 (采购脚本是一个例外,但是ssh-agent是二进制的。)

#1 楼

ssh-agent输出需要连接到它的环境变量:

shadur@proteus:~$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-492P67qzMeGA/agent.7948; export SSH_AUTH_SOCK;
SSH_AGENT_PID=7949; export SSH_AGENT_PID;
echo Agent pid 7949;
shadur@proteus:~$ 


通过调用eval,您可以立即将这些变量加载到您的环境中。

关于为什么ssh-agent本身不能做到这一点...请注意选择这个词。不是“不会”,“不会”。在Unix中,进程只能修改自己的环境变量,并将其传递给子进程。它不能修改其父进程的环境,因为系统不允许这样做。这是非常基本的安全设计。

您可以使用eval解决ssh-agent utility的问题,其中utility是您的登录Shell,窗口管理器或其他需要设置SSH环境变量的东西。手册中也提到了这一点。

评论


谢谢,这清楚地说明了正在发生的事情,而我明白了,但是为什么它是按这种方式设计的而不是按设计的方式运行,所以会自动向环境中添加变量?它增加了任何形式的灵活性吗???

– jx12345
17年3月15日在21:35



@ jx12345您可以使用ssh-agent实用程序来解决问题,该实用程序是您的登录Shell,窗口管理器或其他需要设置SSH环境变量的东西。手册中也提到了这一点。没有外部实用程序可以在调用环境中设置变量。

– Kusalananda♦
17 Mar 15 '21:36



@ jx12345因为它可以将变量添加到其自己的环境中,但不能将变量添加到您的Shell环境中,因为它不是您的Shell。

–user253751
17 Mar 16 '17 at 2:44

@ jx12345进行说明:如果可以在父进程中添加或更改env变量,则可以想象会影响父级的父级,依此类推,直到PID1。这被称为“特权升级”,从安全性的角度来看这确实是一件坏事立场。

– Shadur
17年8月29日在14:31

很好的解释。但是,为什么每次我创建一个新会话(如在.bashrc中)时都不必这样做?

– pitosalas
20-10-14在15:34