如何找出Linux群组中的哪些用户?


67

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


3
那是groups命令。由于Linux是coreutils的一部分,因此您不太可能在Linux上没有它。
托马斯·迪基

@ThomasDickey但这是可能的-就像在某些NASes上一样。
Thomas W.

Answers:


43

您可以使用grep:

grep '^group_name_here:' /etc/group

这仅列出补充组成员资格,而不列出以该组为主要组的用户。并且它仅查找本地组,而不查找来自LDAP等网络服​​务的组。


6
不适用于集中式身份验证。
Maxim Egorushkin

1
这可能真的很混乱,可能是因为主要/次要差异。我认为应该避免这样做sudo lid -g {group}。我有一个系统,该答案在一个组中列出了8个用户,而在sudo lid -g {group}列表中列出了10个用户
。– DKroot

参见getent下面@Murray Jensen的回答
scrutari

83

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

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

因此,对于一个小组,您应该使用以下内容...

getent group name_of_group

name_of_group替换为要查找的组。请注意,此操作仅返回补充组成员身份,不包括以该组为主要组的用户。

您还可以进行很多其他查找,这passwd是另一种有用的查找,您需要列出主要组。


1
如果您不是管理员,并且组信息存储在其他服务器中,则其他答案不适用。
安德烈斯·阿尔卡拉斯(AndrésAlcarraz)'18年

1
这可能真的很混乱,可能是因为主要/次要差异。我认为应该避免这样做sudo lid -g {group}。我有一个系统,该答案在组中列出了8个用户,而在sudo lid -g {group}列表中列出了10个用户
。– DKroot

12

容易做 groups [username]

如果要列出所有本地用户及其本地组,可以执行

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

如果显示“ groups:not found”,则可能是您编辑了更糟糕的环境路径,以重置路径 PATH=$(getconf PATH)


它适用于特定的群体(如果| grep {group}添加了该群体),并且给出的答案不像getent group name_of_groupgrep '^group_name_here:' /etc/group
DKroot

1
cat /etc/passwd您应该使用而不是gentent passwd来列出nis / ldap中的用户。唯一的缺点是它可能需要一段时间。
Brian Minton

7
groupmems -g 组名 -l

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


请注意,这groupmems是大多数Linux发行版上使用的Shadow utils的一部分,但是groupmemsDebian和衍生产品目前不存在(现已修复了一个错误,但尚未包含在任何发行版中(截至2016年11月))
StéphaneChazelas

2
还请注意,groupmems仅处理其中的组/etc/group(而不处理LDAP或其他用户数据库中的组),并且在尝试打开/ etc / gshadow时需要超级用户特权。
斯特凡Chazelas

尽管有上述注意事项,但此命令在某些情况下还是理想的,因为它不需要对输出(即cut和朋友)进行额外的分析。
bonh,2017年

这可能真的很混乱,可能是因为主要/次要差异。我认为应该避免这样做sudo lid -g {group}。我有一个系统,其中此答案列出了一个组中的8个用户,但sudo lid -g {group}列出了10个
。– DKroot

5

我很惊讶没有人提到

id <user>

此命令将提供用户所在的组的列表。


3
因为(与标题相反),发问者想知道给定组中的用户,而不是问题中详述的给定用户组中的用户。我现在改写标题以匹配内容。
Dubu 2015年

啊,我明白了。我应该更好地阅读问题文本。谢谢。
Alex

3

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

# lid -g <groupname>

4
lid是libuser的一部分,libuser在许多发行版中均未默认安装。
克里斯·

2

OP措辞了该问题,以排除使用groups命令的可能性。由于这是Linux上coreutils的一部分,因此(a)已将其删除,或(b)OP混淆了该名称。

OP可以这样使用groups,例如:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

一个建议的答案只是grep中的组名/etc/group。有时,这按预期工作。

更好地使用grep时应考虑以下语法/etc/group

group_name:password:GID:user_list

因此只有第一个冒号之前的部分是有效的组名。不考虑语法的普通grep可以(并且将)从文件中获取误导性匹配。使用正则表达式使grep完全匹配所需的内容:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

或使用shell变量:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

但是,仅列出不在默认组中的那些。要添加这些密码,您需要考虑密码文件,例如,通过从中提取组ID编号/etc/group,并从中打印其默认组与之匹配的用户/etc/passwd,例如,

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

您可以只使用grep和sed来做同样的事情,但是比使用awk还要多。

建议使用的另一个建议答案getent,该答案也可能在Linux机器上(对于Debian,它是GNU libc的一部分)。但是,快速检查表明它仅提供/etc/group内容。

我(像大多数人一样)没有libusers或没有lid安装,因此无法评论它是否满足OP的条件。

还有一个id程序,它提供组信息。可能有人会对此进行扩展。


或者只是,sed -n "s/^$groupname:.*://p" /etc/group但是如果组名包含RE运算符(.例如,在组名中并不罕见),那仍然可能报告错误的结果。
斯特凡Chazelas

GNU getent还将查询LDAP / NIS ...尽管在为组数据库显式禁用枚举时可能不会查询。
斯特凡Chazelas

请注意,这groups将无济于事,因为它列出了给定用户所属的组,而不是给定组的成员列表。
斯特凡Chazelas

2

奇迹般有效:

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

与@ARG的公认答案不同,此命令列出具有<groupname>作为其主要组的用户
Bhavik

这应该是公认的答案
Nikolay Nenov

1
我不同意。因为它在/ etc / passwd文件中读取用户,这会不会与访问LDAP等其他nsswitch的模块工作
伊万Vučica

对于我来说,这工作不正常:我在一个小组中只有4个成员,而sudo lid -g名单8。@Bhavik接受的答案也不正确。
DKroot

2

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

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | 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

与涉及getent或grep的答案不同,它在我的系统上正常工作'^group_name_here:' /etc/group
DKroot

0

此user3717722方法的修改将列出NIS数据库中的组成员:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.