如何在 Linux 中找出哪些用户在一个组中?

Jes*_*ise 110 users group

我最近一直在创建新用户并将他们分配给某些组。我想知道是否有一个命令可以显示分配给某个组的所有用户?我曾尝试使用“groups”命令,但是每当我使用它时,它都会显示“groups: not found”

Mur*_*sen 130

我更喜欢使用getent命令......

由于 getent 使用与系统相同的名称服务,因此 getent 将显示所有信息,包括从 LDAP 等网络信息源获得的信息。

所以对于一个组,你应该使用以下...

getent group name_of_group
Run Code Online (Sandbox Code Playgroud)

其中name_of_group替换为您要查找的组。请注意,这仅返回补充组成员身份,不包括将此组作为主要组的用户。

您可以执行许多其他查找……这passwd是另一个有用的查找,您需要列出主要组。

  • 如果您不是管理员并且组信息存储在其他服务器中,则其他答案不适用。 (3认同)
  • 这可能真的很令人困惑,可能是因为主要/次要差异。我认为应该避免这种情况,而应使用“sudo lit -g {group}”。我有一个系统,该答案列出了一个组中的 8 个用户,而“sudo lit -g {group}”列出了 10 个用户。 (2认同)

小智 62

您可以使用 grep:

grep '^group_name_here:' /etc/group
Run Code Online (Sandbox Code Playgroud)

这仅列出补充组成员资格,而不是将此组作为其主要组的用户。它只查找本地组,而不是来自网络服务(如 LDAP)的组。

  • 不适用于集中式身份验证。 (9认同)
  • 由于主要/次要差异,这可能真的令人困惑。我认为应该避免这种情况,以支持 `sudo Lid -g {group}`。我有一个系统,该答案在一个组中列出了 8 个用户,而 `sudo Lid -g {group}` 列出了 10 个用户。 (2认同)
  • 请参阅下面 @Murray Jensen 的“getent”回答 (2认同)
  • 这不应该是公认的答案。现代 Linux 安装有多个用户/组信息源 - 不仅仅是本地 `/etc/passwd` 和 `/etc/group` - 例如 `nsswitch` 或 `sssd`。使用 `getent passwd` 获取用户信息,使用 `getent group` 获取组信息 - 这将涵盖所有现代 Linux 配置。 (2认同)

ZN1*_*N13 17

更容易做 groups [username]

如果您想列出所有本地用户及其本地组,您可以这样做

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

如果你得到“groups: command not found”,很可能你已经编辑了更糟糕的环境路径,重置你的路径 PATH=$(getconf PATH)

  • 如果 `| 它适用于特定组 添加了 grep {group}` 并给出了正确的答案,与 `getent group name_of_group` 或 `grep '^group_name_here:' /etc/group` 不同 (3认同)
  • 您应该使用 `gentent passwd` 而不是 `cat /etc/passwd`,这样 nis/ldap 中的用户仍然会列出。唯一的缺点是可能需要相当长的时间。 (2认同)

小智 11

groupmems -g组名-l

列出命名组中的所有用户。

  • 还要注意,`groupmems` 只处理 `/etc/group` 中的组(不是 LDAP 或其他用户数据库中的组),并且在尝试打开 /etc/gshadow 时需要超级用户权限。 (3认同)
  • 尽管有上面提到的警告,这个命令对于某些情况来说是理想的,因为它不需要对输出进行额外的解析(即“cut”和朋友)。 (3认同)
  • 这可能真的很令人困惑,可能是因为主要/次要差异。我认为应该避免这种情况,而应使用“sudo cover -g {group}”。我有一个系统,该答案列出了一个组中的 8 个用户,而 `sudo odd -g {group}` 列出了 10 个用户。 (2认同)

小智 8

groups命令打印用户的组成员身份。您可以使用lid命令列出组中的用户,例如:

# lid -g <groupname>
Run Code Online (Sandbox Code Playgroud)

  • `lid` 是 libuser 的一部分,它在许多发行版上都没有默认安装。 (7认同)
  • 此外,在 Ubuntu 20.04 LTS 上,“lid”是“id-utils”软件包的一部分。安装后发现这个`lid`不支持`-g`选项。我知道卡迪尔 6 年前就回答过,但也许是时候更新这里提供的信息了。 (3认同)

Ale*_*lex 7

我很惊讶没有人提到

id <user>
Run Code Online (Sandbox Code Playgroud)

此命令将给出用户所在组的列表。

  • 因为 - 与标题相反 - 提问者想知道给定组中的用户,而不是给定用户的组,如问题中所述。我现在改写标题以匹配内容。 (7认同)
  • 尽管它与实际问题不同,但我敢打赌,每个人都会发现这也是有用的信息! (2认同)

Bha*_*vik 6

奇迹般有效:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Run Code Online (Sandbox Code Playgroud)

  • 我不同意。因为它读取 /etc/passwd 中的用户,所以这不适用于访问 LDAP 等的其他 nsswitch 模块。 (3认同)

小智 6

有些会告诉您安装 libuser(用于“lid”)或members(用于“members”)。但是,基于解决登录组成员身份问题的答案https://unix.stackexchange.com/a/349648/77959,我发现该脚本未涵盖另一个组。所以 - 这是两种方法的最佳组合:

#!/bin/bash
if [ $# -eq 1 ]; then
        gid=`getent group "$1"|cut -d: -f3`
        list_a=`cut -d: -f1,4 /etc/passwd | grep ":$gid$" | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi
Run Code Online (Sandbox Code Playgroud)