![setgid(2) 有什么用?](https://linux22.com/image/618048/setgid(2)%20%E6%9C%89%E4%BB%80%E4%B9%88%E7%94%A8%EF%BC%9F.png)
我无法理解 POSIX 权限,特别是设置gid(2)。 我明白那个设置用户标识 (2)更改调用进程的用户 ID,使其获得新用户的权限。这是有道理的,因为用户只有一个 UID,因此进程也可能只有一个 UID。
我不明白的是,为什么一个进程只能有一个 GID?毕竟,用户可以是任意数量的组的成员,那么是什么决定了进程以哪个 GID 运行?我知道每个用户都有一个“主”GID,这是用户运行的进程默认采用的 GID。但是,如果应用程序必须访问属于用户主组(因此是进程的 GID)以外的组的文件,该怎么办?尝试设置 gid 以匹配文件的 GID 是应用程序的责任吗?或者内核是否只是检查进程的 UID 是否是文件所属组的成员,并根据文件的组权限允许或拒绝访问?在后一种情况下,似乎不需要 setgid。
例如:我是“adm”组的成员,但我的主要组是“griffin”。不知何故,我仍然能够 cat “adm”组中的文件。cat 是否在访问文件之前使用 setgid 将其 GID 更改为“adm”?或者内核是否在返回文件描述符之前检查用户“griffin”是否是“adm”的成员(在这种情况下,不需要 setgid)?进程的 GID 与所需组成员的用户的 UID 有何根本区别?
如对此问题有任何澄清,我们将不胜感激。
答案1
它主要与新文件和目录的创建有关。
默认情况下,文件将作为主组创建。如果您希望使用不同的组 ID 创建文件,则需要 setgid()。在创建新文件/目录之前,请使用 setgid()。