两个组具有相同的名称(但 gid 不同)是否有效?

两个组具有相同的名称(但 gid 不同)是否有效?

今天我在centos系统上安装“passenger”网络服务器时遇到了一个奇怪的问题。

服务器无法为其创建的目录设置 GID,即使它尝试使用当前用户的组也是如此。错误如下:

无法将目录“/tmp/passenger.spawn.XXXX6rOcmE/envdump”的 UID 更改为 1005,GID 更改为 100:不允许操作 (errno=1)

经过一番挖掘,我发现问题在于有两个组具有相同的名称,但 GID 不同,如下面的命令所示:

$ getent group | grep users
users:x:100:
users:*:1001:asdf,sdafsdf,zzzz

重命名两个组之一后,问题得到解决。

所以我的问题是:根据规范,同一系统上的两个组具有相同的名称是否有效?

原因是,如果它有效,我计划为乘客提交错误报告,因为它无法处理这种情况,如果它无效,那么应该向 centos 报告错误。

答案1

忘记规范,考虑实践中会发生什么。主要要注意的是文件系统权限,包含组名,它们只包含整数组ID。 (底层系统调用是chown()gid_t,您可以在参数列表中看到。)

因此,chgrpchown或任何用于更改目录组的工具都必须从用户给出的名称中找出正确的组 ID。当两个名字相同时,就无法分辨哪个是同名的。对于 中的组/etc/group,您很可能总是获得第一个。存储用户和组的某些其他方式甚至可能无法存储相同的名称两次,例如,如果在 LDAP DN 或其他类似的主键中使用该名称。

假设第一行生效,命名组users将解析为 GID 100,如果相关用户是asdf,他们将是组 1001 的成员,但不是组 100 的成员,并且chgrp会失败。

答案2

不,它无效;我不确定 POSIX 中是否明确说明了这一点,但是定义chgrp假设给定组名称存在单个组 ID(如果有):

团体

组数据库中的组名称或数字组 ID。要么指定要赋予由文件操作数之一命名的每个文件的组 ID。如果一个数字团体操作数作为组名存在于组数据库中,与该组名关联的组ID号被用作组ID。

以类似的方式,getgrnam只处理给定名称的单个组。

(从技术上讲,如果多个组名称指向同一个 id,事情就会起作用,尽管规范实际上不允许这样做;但反之则不然。)

相关内容