我想验证用户帐户filesender_1是否是组valid_senders的成员。
当我查看 /etc/group 时,filesender_1不存在:
valid_senders:x:12345:production_1
我将其读作“production_1 是组 valid_senders 的唯一成员,其组 ID 为 12345。”
然而:
当我查看 /etc/passwd 时,为filesender_1列出了valid_senders的组 ID ...
filesender_1:x:1515:12345:filesender_1:/local/home/filesender_1:/bin/sh
...所以我知道valid_senders是 filesender_1 的主要组。
这是一个令人惊讶的差异,还是 /etc/group 仅列出该组次要的成员是否正常?
是的,主要组和辅助组之间存在差异。主要组是 中显示的主要组
/etc/passwd
,用户在登录时所在的组。对于要在补充组中的用户,他们的用户名将添加到 中的组条目中/etc/group
。如果您使用id -a <user>
,它将显示主要组和辅助组。补充组提供对资源的访问权限,但任何新文件都是使用主要组创建的。newgrp
您可以使用该命令更改用户当前活动的主要组。用户不必让主要组也成为次要组。它所要做的就是减少用户可以加入的辅助组的数量。传统上,一个用户仅限于 32 个辅助组,但近年来可能发生了变化。
usermod
可以在一个命令中设置用户的主要和辅助组。使用像 puppet 这样的配置管理工具也可以做到这一点,而不必担心在不同类型的 unix 上需要什么特定的命令。是的,这种差异是正常的。我已经看过很多次了,我不再查看
/etc/passwd
and/etc/group
文件,而是开始以应该查看的方式查看组成员身份:getent group <groupname>
和groups <username>
.有一个名为members的程序可以安装在大多数 Linux 发行版上,它列出了组的实际成员,无论它是主要组还是辅助组。
通常,当创建用户时没有使用 -g 或 --gid 指定组,默认行为是将其主组设置为其用户名,并且此 gid 不会放在 /etc/group 文件中。因此,用户 joe 创建的文件和目录将拥有 joe:joe 的所有权。但是您不会在 /etc/group 文件中找到组 'joe'。
如果您将用户 joe 添加到组“学生”中,则运行
将在学生组的用户列表中显示 joe 。
运行程序
on a group 将显示属于groupname的主要或辅助成员的用户。
一般来说,系统管理员应该在 /etc/group 中将用户添加到他们的主要组的成员列表中,因为 getpwent() 系列系统调用将在调用时删除重复项。程序不应该直接读取 /etc/group 或 /etc/passwd,它们应该使用系统调用。这一切已经存在至少 20 年了,而且可能更久。
你应该使用
lid -g <group>'