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


66

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

eval $(ssh-agent)

为什么我要eval输出ssh-agent

为什么不设计它以便我可以运行它?


注意:不推荐使用反引号(`)。例如,您可以在此处阅读有关它的更多信息


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


9
@ 0xSheepdog man页面,开始...
jasonwryan

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

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

Answers:


79

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

4
@ jx12345你可以避开eval使用ssh-agent utility这里utility是你的登录shell,你的窗口管理器或任何其他事情都需要有设置SSH环境变量。手册中也提到了这一点。没有外部实用程序可以在调用环境中设置变量。
库沙兰丹

@kusalananda正确;随时将其添加为修改内容。我现在要上床睡觉,或者我自己做。
Shadur

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

3
@ jx12345需要说明的是:如果可以在父进程中添加或更改env变量,则可以想象会影响父级的父级,依此类推,直到PID1。这被称为“特权升级”,从安全性的角度来看这确实是一件坏事立场。
Shadur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.