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

已发表: 2022-08-29
显示 bash 提示符的 Linux 笔记本电脑
fatmawati achmad zaenuri/Shutterstock.com

在 Linux 上,文件具有三组权限。 一组用于文件组。 在将文件分配给组之前,您可能需要检查组成员是谁。

文件和目录权限

Linux 上的文件和目录对所有者有一组权限,对文件分配到的组有另一组权限,对不属于前两个类别之一的每个人都有权限。

每组权限定义该类别的成员是否可以读取、写入或执行文件。 在目录的情况下,执行操作等同于能够cd进入目录。

文件或目录的默认组是所有者的默认组。 这通常是创建它的人。 组权限用于允许一组用户对该组的其他成员的文件和目录具有受控访问权限。

例如,您可能有一个开发团队、一个文档团队、一个研究团队等等。 可以将每个团队的成员添加到适当命名的组中,以帮助协作。 用户可以同时在多个组中。

这是一个简单但稳健的方案。 但是,如果您的文件很敏感,那么在与他们分享您的工作之前,您可能会更乐意检查该组的成员是谁。 有不同的方法可以做到这一点。 但请注意。 两种最常推荐的方法是有问题的。

相关:如何在 Linux 上使用 chgrp 命令

/etc/groups 文件

“/etc/group”文件包含以冒号“ : ”分隔的组和组成员列表。 每行有四个字段。

  • Name :组的唯一名称。
  • 密码:未使用。 这将始终保持“x”。
  • 组 ID :唯一的组标识符。
  • 用户:组成员的逗号分隔列表。 对于系统和守护程序帐户,该列表通常为空。

要将文件的内容转储到终端窗口,可以使用cat ,但使用less滚动文件内容更方便。

 少 /etc/group 

使用 cat 查看 /etc/group 文件的内容

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

less 文件查看器中 /etc/groups 文件的第一部分

如果我们想发现特定用户所在的组,我们可以使用grep来搜索带有用户帐户名的条目。 这不是我们手头的任务。 我们希望看到属于某个组的每个人,而不是一个人所属的组。 但对我们来说看看是有启发性的。

 grep “戴夫” /etc/group 

用户 dave 所属的组列表

为我们列出了包含字符串“dave”的条目。 隐藏在其中的迹象表明,事情可能并不像我们想象的那么简单。

将用户添加到 Linux 时,默认操作是将他们放在与其用户帐户同名的组中。 这是他们的主要群体。 将它们添加到的任何其他组称为辅助组。

问题是用户没有被列为其主要组的成员。 这就是组“dave”没有显示任何成员的原因,尽管用户“dave”是该组的成员。

当然,系统管理员可以将任何用户的主组更改为任何其他组的主组。 这意味着用户可以是任何组的成员,但不会在“/etc/group”文件中这样列出。 这是一个问题。

第二个问题是“/etc/group”文件不是单一的事实来源。 现代 Linux 安装可能会将用户和组信息存储在比“/etc/passwd”和“/etc/group”更多的位置,尤其是在部署了轻量级目录访问协议等服务的公司情况下。 只看一个地方,你可能看不到全局。

在我们的测试场景中,我们为一个开发部门创建了四个组。 他们是:

  • resteam :研究团队。
  • devteam :开发团队。
  • pvqteam :产品验证和质量团队。
  • docteam :文档团队。

我们为这些团队增加了人员。 有些人在不止一个团队中。 如果我们在less中打开“/etc/group”文件并滚动到文件底部,我们将看到新的组和组成员。 至少,与“/etc/group”文件所知道的成员一样多。

less 文件查看器中 /etc/group 文件的底部

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

 grep "^devteam" /etc/group 

使用 grep 提取单个组的成员

这将从文件中提取“devteam”条目并列出所有组成员。 或者是吗?

getent 命令

getent命令检查多个数据库的用户组信息,而不仅仅是“/etc/group”。 我们将使用getent向我们展示用户组。

使用 getent 列出所有已定义的组

使用getentgroup选项——在这台测试机器上——产生与使用“/etc/group”文件相同的结果。 那是因为我们没有使用 LDAP 或任何其他集中式命名服务。 因此,没有其他来源可供getent参考。

getent 组的输出显示组和成员

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

getent命令可以为我们查看单个组。 我们将看看“devteam”组。

 getent group devteam 

使用 getent group 提取单个组的详细信息

我们得到与以前完全相同的结果。 不过有一种方法可以深入挖掘。

相关:如何在 Linux 中列出用户

盖子命令

lid命令是libuser工具集的一部分。 它已经安装在我们的 Fedora 36 测试计算机上,但必须安装在 Ubuntu 22.04 和 Manjaro 21 上。

此外,该命令在 Fedora 和 Manjaro 上称为lid ,但在 Ubuntu 上,您需要使用libuser-lid

要在 Ubuntu 上安装命令,请键入:

 sudo apt install libuser 

在 Ubuntu 上安装 libuser

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

 耶 libuser 

在 Manjaro 上安装 libuser

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

 sudo libuser-lib 戴夫

使用 libuser-lid 显示用户 dave 所属的组

要查看组的成员,请使用-g (组)选项以及组的名称。

 sudo libuser-lid -g devteam 

使用 libuser-lid 列出 devteam 组的成员

瞧,一个名为“francis”的用户出现在列表中。 这是我们第一次见到他。 他没有在“/etc/group”中列出, getent也没有发现他。

让我们看一些使用groups命令的用户。

 团体阿比盖尔
团体海登
弗朗西斯集团

对选择的用户使用组命令

  • 用户“abigail”在一个名为“abigail”的组和另外两个组“resteam”和“devteam”中。
  • 用户“hayden”在一个名为“hayden”的组和另外两个组“pvqteam”和“docteam”中。
  • 用户“francis”在一个组中,即“devteam”组。 值得注意的是,他们不在一个名为“francis”的组中。
在 Linux 上将用户添加到组(或第二组)
相关在 Linux 上将用户添加到组(或第二组)

我们知道每个用户都必须是主要组的成员,并且默认情况下,主要组具有与用户的 UID 和帐户名称匹配的 GID 和名称。 用户“francis”似乎有些不同。

让我们使用id命令,看看 UID 和 GID 告诉我们什么。

 艾比盖尔
弗朗西斯

在用户 abigail 和 francis 上使用 id 命令

用户“abigail”的 UID 为 1002,GID 为 1002。它们分为三组,其中一组称为“abigail”。 它的 GID 为 1002。这是他们的默认主要组。

用户“francis”的 GID 为 1019,与“devteam”组的 GID 匹配。 此用户已被分配一个新的主要组,或者当此用户添加到系统时,“devteam”组被设置为他们的主要组。

无论是哪一个,只有libuser-lid检测到它们并报告它们在“devteam”组中的存在。

魔鬼在细节中

所以看到真实的细节很重要。

小组是建立协作的好方法,只要您知道要与谁开放即可。

相关:如何在 Linux 上使用 chfn 和 usermod 更改用户数据