我们都知道 linux 系统调用 setid() 允许我们随时创建新会话,尽管典型的做法是在我们登录或要启动新守护进程时。而且我注意到 linux-PAM(可插拔认证模块)也有“会话管理”的概念,所以我的问题是:Linux PAM 中的会话是否与 setid() 创建的会话相同?在 linux PAM 会话中通常可以做什么?谢谢。
简短的回答是否定的,它们是不同的东西,但是处理登录会话的进程应该同时处理它们。
PAM 会话是 libpam 的内部概念。简而言之,当一个使用 PAM 的应用程序启动时,它pam_start会调用一个或多个 PAM 函数,这些函数又由 libpam 分派给 PAM 模块。其中两个调用是pam_open_session和pam_close_session。
PAM 会话的目标是处理(通常是交互式的,但不一定)登录会话的设置和拆卸。因此,会话组中配置的 PAM 模块通常会执行诸如将用户添加到 utmp、设置任何每次登录的环境(例如,如果配置此类内容的本地 tmpdir)、存储 Kerberos 凭据等。在会话关闭时,他们将撤消这些更改。
请注意,这意味着调用的进程必须pam_open_session在登录会话的长度内停留,以便它可以pam_close_session在结束时调用。没有什么魔法可以让这一切发生。
setsid是低得多的东西。 setsid与进程组处于大致相同的级别,进程组是通常连接到 tty(控制终端)的相关进程组。这样做的目的主要是为了 shell 会话管理:您的会话是在您关闭 shell 时通常应该接收 SIGHUP 的所有进程,您可能希望通过进程管理(例如挂起和继续)进行管理,等等。shell 会话组中的所有进程都有一个设置为伪 tty 的控制终端,它对进程控制和信号处理有各种低级影响。