为什么要评估 ssh-agent 的输出?

jx1*_*345 103 shell ssh ssh-agent eval

为了运行,ssh-agent我必须使用:

eval $(ssh-agent)
Run Code Online (Sandbox Code Playgroud)

为什么需要eval输出ssh-agent? 为什么我不能运行它?

Sha*_*dur 123

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:~$ 
Run Code Online (Sandbox Code Playgroud)

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

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

你可以避开eval使用ssh-agent utility这里utility是你的登录shell,你的窗口管理器或任何其他的事情需要有设置SSH环境变量。手册中也提到了这一点。

  • @jx12345 因为它可以向自己的环境添加变量,但不能向您的 shell 环境添加变量,因为它不是您的 shell。 (5认同)
  • @jx12345 您可以使用“ssh-agent 实用程序”绕过“eval”,其中“实用程序”是您的登录外壳、窗口管理器或任何其他需要设置 SSH 环境变量的东西。手册中也提到了这一点。没有任何外部实用程序可以在调用环境中设置变量。 (4认同)
  • @jx12345澄清:如果我可以向父进程添加或更改环境变量,我可以想象会影响父进程的父进程,依此类推直到 PID 1。一个安全的立场。 (3认同)
  • 很好的解释。但为什么我不必每次创建新会话时都执行此操作,就像在我的 .bashrc 中一样? (2认同)