答案1
您在这里混合了两种不同的区别:
- 之间真实的和有效的组ID
- 之间基本的和补充用户组
第一个区别是指进程如何运行。通常,当您运行命令/程序时,它会以您的用户的权限运行。它有真实的组 ID 与您用户的主要组相同。这可以由进程更改,以便作为另一个特殊组的成员执行某些任务。为此,程序使用setgid
改变它们的函数有效的组 ID。
第二个区别是指用户。每个用户都有他/她的主要群体。每个用户只有一个,称为吉德在命令的输出中id
。除此之外,每个用户可以属于多个补充组- 这些列在输出的末尾id
。
[编辑] :
我同意id
这里的联机帮助页有些误导。这可能是因为它是信息文档提供的描述的精简版本。为了更清楚地看到它,请运行info coreutils "id invocation"
(按照手册末尾的建议id
)。
答案2
内核视图
从概念上讲,进程属于三组组。每组都是下一组的子集。
- 作为进程默认组的单个组,该进程创建的文件将属于该组。
- 当组需要打开文件的权限时检查的一组组。
- 以额外权限运行的进程可以利用的一组组。
由于历史原因,这些集合分别是:
- 这有效组ID(如);
- 有效组 ID 加上补充组 ID;
- 以上所有加上真实组ID和已保存的集合组 ID。
通常,一个程序有一个用户 ID。如果可执行文件具有设定值mode 位设置,则该程序有两个用户 ID:其有效用户 ID 与文件权限、每用户限制、确定进程是否以 root 身份运行等相关。如果进程不需要始终拥有额外的权限,或者需要在两个非 root 用户之间切换,则可以在有效用户 ID 和真实用户 ID 之间切换。
团体也存在同样的机制。对于组来说,还有一个在系统设计时不存在的附加功能:一个进程可以是任意数量的组的成员;这些是补充组 ID。
用户数据库视图
一旦用户通过身份验证,登录过程就会在启动用户的 shell(或用户请求的任何程序)之前切换到该用户。就在切换到所需用户(并失去 root 权限)之前,登录过程会切换到所需组。
在早期的 UNIX 版本中,一个进程只能位于一个组中。该组是用户的主要组 ID,存储在用户数据库中(通常为/etc/passwd
)。该组成为登录进程启动的shell或其他程序真实有效的组ID。
如今,一个进程可以属于多个组,因此用户也可以属于多个组。组数据库(通常/etc/group
)包含每个组的用户列表。这些组成为登录过程启动的程序的补充组 ID。
答案3
这里有许多其他优秀的答案,但如果您仍然像我一样感到困惑,这里有另一种方法。 请注意,我只是这个东西的学生,不是大师,所以这个答案是一个正在进行的工作,并且不被认为是一个可靠的答案,至少现在还不是。考虑这个答案 v0.2。
群体既简单又复杂。
下面使用的 ID 的关键:
KEY Full name -------- Description---------------------------------------------
u User uID = User ID (a unique # associated with each user)
g Group gID = Group ID (a unique # associated with each group)
While each /etc/passwd entry has one uID and one gID,
additional gIDs can be associated with a users via
/etc/group.
L Login IDs - uID and gID produced from the Login process.
('L' is not exactly standard Linux terminology, but
useful for explanations below.)
F File IDs - uID and gID retrieved from a file's ownership.
('F' is not exactly standard Linux terminology, but
useful for explanations below.)
R Real IDs - Who actually runs a process
E Effective IDs - Who spoofed via setuid or setgid, runs a process
O Original Eff. IDs - Place to save the original Effective ID when changing
it (e.g. temporarily downgrading it) so can later
restore it. Also called "Saved ID"; (but 'S' was not
used for here to help avoid confusion with the 'S' in
'SetUserID' & SetGroupID.)
+ Supplimentary gIDs - Optional, additional groups (none or more) running
this process which can be used to test for permissions.
用户和组 ID 名称:
Category USER GROUP Notes
----------------- ---- ----- -------------------------------------------
From login: LuID LgID From /etc/passwd lookup
From files: FuID FgID Each file has these. Set by creator process.
For each running process:
Real RuID RgID Actual user starting the program
Effective EuID EgID Assigned user starting the program*
Saved OuID OgID Saves original effective ID.
Supplementary +gID1 (optional, additional groups)
+gID2
...
进程如何获取ID:
1)登录验证用户名并返回LuID
和LgID
from /etc/passwd
。
2)第一道工序设置 effective=real=login,即
EuID=RuID=LuID
EgID=RgID=LgID
3)分叉的孩子继承RuID
, EuID
, RgID
, 和EgID
, (&可能保存&支持),但是,
如果你在要执行的新程序的文件上设置 id 位,然后从文件中设置有效:
EuID=FuID
如果G在要执行的新程序的文件上设置 id 位,然后从文件中设置有效:
EgID=FgID
注意:底层文件系统的苏伊德和诺苏伊德安装选项也适用。
4a)如果是你id已被使用设置EuID
,然后EuID
可以临时更改(例如从根降级),但首先保存其原始值,OuID
以便以后可以在需要时恢复。
4b)如果是Gid已被使用设置EgID
,然后EgID
可以临时更改(例如从根降级),但首先保存其原始值,OgID
以便以后可以在需要时恢复。
当要创建文件时:
File's new id's are set from effective id's: FuID=EuID and FgID=EgID
(Permissions are set from umask.)
打开阅读:
If FuID = EuID and user-read bit is set, or
If FgID = EgID and group-read bit is set, or
If FgID = +gID1 and group-read bit is set, or
If FgID = +gID2 and group-read bit is set, ...
then allow reading.
打开进行写入:
(Same as above but write bit set to allow writing.)
打开执行:
(Same as above but execute bit set to allow execution.)
当需要发送消息时:
Use RuID and RgID. (Not EuID or EgID). *(Not sure where I read this.)*
参考:男子凭证
额外的:这是一个用于漂亮打印 /etc/group 文件的实用程序:
cat /etc/group | sort -t: -k3n | awk -F ':' \
'BEGIN{printf "\n%-20s %-3s %-8s %s", \
"Group name","pw", "Group ID ", "User list"}\
BEGIN{printf "\n%-20s %-3s %-8s %s\n", \
"----------","--", "---------", "---------"} \
{ printf "%-20s %-3s %8d %s\n", $1, $2, $3, $4 }'