如何在 Linux 上列出一个组中的所有用户

在 Linux 上,文件具有三组权限。一组用于文件组。在将文件分配给组之前,您可能需要检查组成员是谁。
文件和目录权限
Linux 上的文件和目录对所有者有一组权限,对文件分配到的组有另一组权限,对不属于前两个类别之一的每个人都有权限。
每组权限定义该类别的成员是否可以读取、写入或执行文件。在目录的情况下,执行操作等同于能够 cd
进入目录。
文件或目录的默认组是所有者的默认组。这通常是创建它的人。组权限用于允许一组用户对该组的其他成员的文件和目录进行受控访问。
例如,您可能有一个开发团队、一个文档团队、一个研究团队等等。每个团队的成员都可以添加到一个适当命名的组中,以帮助协作。用户可以同时在多个组中。
这是一个简单但强大的方案。但是,如果您的文件是敏感的,那么在与他们分享您的工作之前,您可能会更乐意检查该组的成员是谁。有不同的方法可以做到这一点。但请注意。最常推荐的两种方法都有问题。
/etc/groups 文件
“/etc/group”文件包含一个冒号“:
”分隔的组和组成员列表。每行有四个字段。
- 名称:组的唯一名称。
- 密码:未使用。这将始终保持“x”。
- Group ID:唯一的组标识符。
- 用户:以逗号分隔的组成员列表。对于系统和守护程序帐户,该列表通常为空。
要将文件内容转储到终端窗口,您可以使用 cat
,但使用 less
滚动文件内容会更方便。
less /etc/group

列表顶部的大多数条目都没有成员,尽管“adm”组有两个,“cdrom”组有一个。

如果我们想要发现特定用户所在的组,我们可以使用 grep
来搜索包含其用户帐户名的条目。这不是我们手头的任务。我们希望看到属于某个组的每个人,而不是一个人所属的组。但对我们看一看是有启发意义的。
grep "dave" /etc/group

为我们列出了包含字符串“dave”的条目。隐藏在其中的是一个迹象,表明事情可能并不像我们想象的那么简单。
将用户添加到 Linux 时,默认操作是将他们放入与其用户帐户同名的组中。这是他们的主要群体。他们添加到的任何其他组都称为次要组。
问题是用户没有被列为他们的主要组的成员。这就是为什么组“dave”没有显示任何成员,尽管用户“dave”是该组的成员。
当然,系统管理员可以将任何用户的主要组更改为任何其他组的主要组。这意味着用户可以是任何组的成员,但他们不会在“/etc/group”文件中这样列出。这是一个问题。
第二个问题是“/etc/group”文件不是唯一的真实来源。现代 Linux 安装可能会将用户和组信息存储在比“/etc/passwd”和“/etc/group”更多的地方,尤其是在部署了轻量级目录访问协议等服务的公司环境中。只看一个地方,你可能看不到全局。
在我们的测试场景中,我们为开发部门创建了四个组。他们是:
- resteam:研究团队。
- devteam:开发团队。
- pvqteam:产品验证和质量团队。
- docteam:文档团队。
我们向这些团队添加了人员。有些人在不止一个团队中。如果我们在 less
中打开“/etc/group”文件并滚动到文件底部,我们将看到新的组和组成员。至少,与“/etc/group”文件所知道的一样多的成员。

如果我们想提取单个组,我们可以使用 grep
进行搜索。插入符号“^
”代表一行的开始。
grep "^devteam" /etc/group

这将从文件中提取“devteam”条目并列出所有组成员。或者是吗?
getent 命令
getent
命令检查多个数据库中的用户组信息,而不仅仅是“/etc/group”。我们将使用 getent
向我们展示用户组。
getent group

将 getent
与 group
选项一起使用会产生(在此测试机器上)与使用“/etc/group”文件相同的结果。那是因为我们没有使用 LDAP 或任何其他集中命名服务。所以没有其他来源可供 getent
参考。

结果与“/etc/group”文件中的结果一致也就不足为奇了。也许我们真正看到的是现实情况。也许一切都很简单——在这台电脑上——所见即所得?让我们对此保留判断。
getent
命令可以为我们查看单个组。我们将看看“devteam”组。
getent group devteam

我们得到与之前完全相同的结果。不过,有一种方法可以更深入地挖掘。
盖子命令
lid
命令是 libuser
工具集合的一部分。它已经安装在我们的 Fedora 36 测试计算机上,但必须安装在 Ubuntu 22.04 和 Manjaro 21 的计算机上。
此外,该命令在 Fedora 和 Manjaro 上称为 lid
,但在 Ubuntu 上,您需要使用 libuser-lid
。
要在 Ubuntu 上安装命令,请键入:
sudo apt install libuser

在 Manjaro 上,libuser
是从 AUR 安装的,因此您需要使用您最喜欢的 AUR 助手。我们使用了 yay
。
yay libuser

您可以使用 libuser-lid
来显示有关组或用户的组信息。要显示个人所在的组,请在命令行中传递他们的用户帐户名。在 Fedora 和 Manjaro 上记得使用 lid
而不是 libuser-lid
。
sudo libuser-lib dave

要查看组的成员,请使用 -g
(组)选项和组名。
sudo libuser-lid -g devteam

瞧,一个叫“francis”的用户已经出现在列表中。这是我们第一次见到他。他没有列在“/etc/group”中,getent
也没有发现他。
让我们看看一些使用 groups
命令的用户。
groups abigail
groups hayden
groups francis

- 用户“abigail”在名为“abigail”的组和另外两个组“resteam”和“devteam”中。
- 用户“hayden”在名为“hayden”的组和另外两个组“pvqteam”和“docteam”中。
- 用户“francis”属于一个组,即“devteam”组。值得注意的是,他们不在名为“francis”的组中。
我们知道每个用户都必须是主要组的成员,并且默认情况下主要组具有与用户的 UID 和帐户名相匹配的 GID 和名称。用户“francis”似乎有些不同。
让我们使用 id
命令,看看 UID 和 GID 告诉我们什么。
id abigail
id francis

用户“abigail”的 UID 为 1002,GID 为 1002。他们分为三组,其中一组称为“abigail”。它的 GID 为 1002。这是他们的默认主要组。
用户“francis”的 GID 为 1019,与“devteam”组的 GID 匹配。该用户要么被分配了一个新的主要组,要么在该用户被添加到系统时将“devteam”组设置为其主要组。
无论是哪一个,只有 libuser-lid
检测到它们并报告它们存在于“devteam”组中。
细节决定成败
所以看到真实的细节很重要。
群组是建立协作的好方法,只要您知道与谁开启协作即可。