GID、当前的、主要的、补充的、有效的和真实的组 ID?

Ame*_*ina 23 users group privileges

以下链接在不同的上下文中讨论了这些概念。我已经阅读了它们的定义,但我仍然无法说出它们之间的关系,或者它们中的一些是否相同。

这是我的困惑来源的一个例子:

根据man id,如果我输入id,我应该得到他们所谓的有效和真实的组 ID。

id uid=501(joe) gid=501(joe) groups=501(joe), 100(users)
Run Code Online (Sandbox Code Playgroud)

但是,维基百科参考了 的输出id来区分主ID和补充ID。此外,维基百科区分主要与补充和有效与真实的组 ID。这些概念如何相互关联?

另外,主要组ID =组ID =当前组ID是真的吗?

roz*_*acz 27

您在这里混合了两种不同的区别:

  1. 之间真正和有效组ID
  2. 之间主要和辅助用户组

第一个区别是指进程是如何运行的。通常,当您运行命令/程序时,它会以您的用户权限运行。它具有与您的用户的主要组相同的真实组 ID。这可以通过进程更改,以便作为另一个特殊组的成员执行某些任务。为此,程序使用setgid更改其有效组 ID的函数。

第二个区别是指用户。每个用户都有他/她的主要组。每个用户只有一个,在命令的输出中称为gidid。除此之外,每个用户都可以属于多个补充组- 这些列在id输出的末尾。

[编辑] :

我同意id这里的联机帮助页有些误导。这可能是因为它是信息文档提供的描述的精简版本。要更清楚地查看它,请运行info coreutils "id invocation"(如id手册末尾的建议)。


Gil*_*il' 19

内核视图

从概念上讲,进程属于三组组。每个集合都是下一个集合的子集。

  1. 作为进程默认组的单个组,该进程创建的文件将属于哪个组。
  2. 当组需要打开文件的权限时检查的组集。
  3. 以额外权限运行的进程可以利用的一组组。

由于历史原因,这些集合分别是:

  1. 的有效组ID(EGID);
  2. 有效组 ID 加上补充组 ID;
  3. 以上所有加上真实的组 ID和保存的 set-group-ID。

通常,程序具有单个用户 ID。如果可执行文件设置了setuid模式位,则该程序有两个用户 ID:其有效用户 ID 与文件权限、每用户限制、确定进程是否以 root 身份运行等有关。该进程可以在有效用户 ID 和真实用户 ID 之间切换,如果它不是一直需要额外的权限,或者如果它需要在两个非 root 用户之间切换。

组存在相同的机制。对于组,还有一个在系统设计时不存在的附加功能:一个进程可以是任意数量组的成员;这些是补充组 ID。

用户数据库视图

一旦用户通过身份验证,登录过程就会切换到该用户,就在启动用户的 shell(或用户请求的任何程序)之前。就在切换到所需用户(并失去 root 权限)之前,登录过程切换到所需组。

在早期的 Unix 版本中,一个进程只能在一个组中。该组是用户的主要组 ID,存储在用户数据库中(通常为/etc/passwd)。该组成为登录进程启动的shell或其他程序的真实有效的组ID。

如今,一个进程可以在多个组中,因此用户也可以在多个组中。组数据库(通常/etc/group)包含每个组的用户列表。这些组成为登录过程启动的程序的补充组 ID。