【问题标题】:Please explain Linux bash exec and ssh-agent behavior请解释 Linux bash exec 和 ssh-agent 行为
【发布时间】:2014-12-21 13:07:21
【问题描述】:

根据https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-openssh-config-ssh-agent.html

我需要执行exec /usr/bin/ssh-agent $SHELL,据我所知exec 用我指定的程序替换我当前的shell。

我读过http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-agent.1?query=ssh-agent&sec=1,其中指出“如果给出命令行,这将作为代理的子进程执行。当命令终止时,代理也将终止。”

所以我猜我期望的是bash被ssh-agent替换,但是因为我指定了一个命令行,一个新的bash被执行,然后ssh-agent被执行,旧的bash被替换。

到底发生了什么?

【问题讨论】:

    标签: linux bash shell exec ssh-agent


    【解决方案1】:

    不完全是。所发生的正是文档所说的。

    1. exec 将当前运行的 shell 替换为 ssh-agent,因此“旧 bash”现在已被替换。

    2. ssh-agent 看到它有一个非选项参数($SHELL 的值),因此它创建了一个子进程并在子进程中 execs 该命令。这会导致ssh-agent 的孩子被替换为新的bash

    3. ssh-agent 本身现在等待其子进程完成。

    4. 同时,新的bash 继承了终端,因此它开始响应您的命令。

    5. 最终,你厌倦了你正在做的任何事情,然后你要么exit 要么键入一个 control-D(文件结尾),bash 进程在此终止。

    6. ssh-agent 注意到它的孩子已经完成,所以它也退出了。

    7. 如果原始bash 进程有父进程,则该父进程现在会收到通知,通知其子进程已终止。如果原来的bash 的父进程不再存在,则init 进程(进程1)已成为父进程。在任何一种情况下,父母(假设它表现良好)都会做一些适当的事情并清理孩子的状态代码以避免留下僵尸。

    注意,“replaced”表示进程中运行的可执行文件已被替换。这并不意味着进程本身已经终止并启动了一个新进程。在调用exec 之后,进程仍然是同一个进程,具有相同的进程 ID 和相同的父进程(就此而言,相同的控制终端和相同的打开文件描述符,除了该进程的文件描述符已标记为“在执行时关闭”)。如果前面的句子显得过于复杂,那么最小的外卖就是“同父异母”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2023-03-03
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多