根据https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-openssh-config-ssh-agent.html
我需要执行exec /usr/bin/ssh-agent $SHELL,据我所知,它用我指定的程序替换我当前的shell。
我读到了http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-agent.1?query=ssh-agent&sec=1中的语句“如果给出了命令行,这将作为代理的子进程执行。当命令失效时,代理也会失效。”
所以我想bash应该被ssh代理替换,但是因为我指定了一个命令行,所以会执行一个新的bash,然后执行ssh代理,然后替换旧的bash。
到底发生了什么?

最佳答案

不完全是。所发生的事情正是文档中所说的。
exec将当前运行的shell替换为ssh-agent,因此“旧bash”现在已被替换。
ssh-agent看到它有一个非选项参数(值$SHELL),因此它创建一个子进程,并在子进程中使用该命令。这会导致exec的子代被新的ssh-agent替换。
bash自身现在等待其子级完成。
同时,新的ssh-agent继承了终端,因此它开始响应您的命令。
最终,你会厌倦做任何你正在做的事情,你要么bash要么键入一个control-d(文件结尾),在这里exit进程终止。
bash注意到它的孩子完成了,所以它也退出了。
如果原始ssh-agent进程有父进程,则该父进程现在会收到其子进程已终止的通知。如果原来的bash父代不再存在,则bash进程(进程1)已成为父级。在这两种情况下,家长——假设它表现良好——会做一些适当的事情,并清理孩子的状态代码,以避免留下僵尸。
注意,“replaced”表示进程中运行的可执行文件已被替换。这并不意味着进程本身已经被终止并启动了一个新进程。在调用init之后,一个进程仍然是相同的进程,具有相同的进程id和相同的父进程(就这一点而言,除了进程标记为“在exec上关闭”的文件描述符之外,还有相同的控制终端和相同的打开文件描述符)。如果前面的句子看起来太复杂,那么最小的外卖是“同一个父母”。

10-07 19:38
查看更多