回到过去Unix的美好时光(例如,史蒂文斯的Unix网络编程,第63页,1990),init forked,孩子运行getty。然后,getty获取用户名并执行/bin/login,将用户名传递给它。然后登录要求输入密码,检查凭据,然后执行/etc/passwd中的任何内容,通常是shell,例如/bin/bash。
getty、login和shell都有相同的PID,这是由于exec的性质和缺少fork。
现在我看到/bin/login派生并运行子进程中的shell,而父进程只是等待子进程。至少这是Linux上的逻辑。为什么会这样呢?它的作用是什么?谁做了这个决定??我可以生成登录而不使用fork吗??
这是一种痛苦,至少对我来说。我正在使用forkpty构建一个伪终端,并在从机端运行login。例如,我使用forkpty的pid结果在孩子中发出一个信号。当然,我需要的是bash的pid,而不是login的pid。现在这两个pid不同了,我必须找到bash的pid,通过popen运行一个令人讨厌的“ps -o pid= --ppid LOGINPID”。
斯图尔特
发布于 2018-07-20 20:20:47
根据https://github.com/shadow-maint/shadow/blob/master/src/login.c#L1186的说法:“我们必须在setuid()之前派生,因为我们需要调用pam_close_session()作为根。”所以要归功于PAM。代码是以USE_PAM为条件的,所以我猜您可以在配置时禁用PAM来重新编译映像。
https://stackoverflow.com/questions/37330602
复制相似问题