【发布时间】:2013-03-17 14:24:22
【问题描述】:
我们都知道 linux 系统调用 setsid() 允许我们在任何时候创建一个新的会话,虽然典型的做法是当我们登录或者当我们想要启动一个新的守护进程时。我注意到 linux-PAM(可插入身份验证模块)也有“会话管理”的概念,所以我的问题是: Linux PAM 中的会话是否与 setsid() 创建的会话相同? 在 linux PAM 会话中通常可以做什么? 谢谢。
【问题讨论】:
我们都知道 linux 系统调用 setsid() 允许我们在任何时候创建一个新的会话,虽然典型的做法是当我们登录或者当我们想要启动一个新的守护进程时。我注意到 linux-PAM(可插入身份验证模块)也有“会话管理”的概念,所以我的问题是: Linux PAM 中的会话是否与 setsid() 创建的会话相同? 在 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 的控制终端,这对进程控制和信号处理具有各种低级含义。
【讨论】: