我最近一直在创建新用户并将其分配给某些组。我想知道是否有一个命令可以显示分配给某个组的所有用户? br />

评论

那是组命令。由于Linux是coreutils的一部分,因此不太可能在Linux上没有它。

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

#1 楼

您可以使用grep:

grep '^group_name_here:' /etc/group


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

评论


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

– Maxim Egorushkin
17年11月16日在17:04

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

– DKroot
18年7月25日在15:35

参见下面@Murray Jensen的getent答案

– scrutari
19年8月2日在15:18

#2 楼

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


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


因此,对于组,应使用以下...

getent group name_of_group


其中name_of_group替换为您所使用的组想抬头。请注意,这仅返回补充组成员身份,不包括以该组为主要组的用户。

您还可以执行很多其他查找...另一个有用的列表,您需要列出主要组。

评论


如果您不是管理员,并且组信息存储在其他服务器中,则其他答案不适用。

–AndrésAlcarraz
18年2月4日在20:37

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

– DKroot
18年7月25日在15:36

#3 楼

容易执行groups [username]

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

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

如果获得“组:找不到命令”,则可能是您编辑了更糟糕的环境路径后,要重置路径,请执行PATH=$(getconf PATH)

评论


它适用于特定组,如果|添加了grep {group}并给出了正确答案,这与getent组name_of_group或grep'^ group_name_here:'/ etc / group不同

– DKroot
18年7月25日在15:39

您应该使用gentent passwd而不是cat / etc / passwd,这样仍会列出nis / ldap中的用户。唯一的缺点是可能要花费相当长的时间。

–布赖恩·明顿(Brian Minton)
19年5月5日在21:13

#4 楼

groupmems -g groupname -l


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

评论


请注意,groupmems是大多数Linux发行版中使用的Shadow utils的一部分,但是Debian和衍生版本目前不存在groupmems(现已修复,但尚未包含在任何发行版中(截至2016年11月))

–StéphaneChazelas
2016年11月6日在22:14



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

–StéphaneChazelas
16年11月6日在22:28



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

– Bonh
17-10-23在14:55

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

– DKroot
18年7月25日在15:42

#5 楼

groups命令为用户打印组成员身份。您可以使用lid命令将用户分组,例如:

# lid -g <groupname>


评论


lid是libuser的一部分,在许多发行版中默认未安装。

–克里斯唐(Chris Down)
2015年11月6日在11:57



#6 楼

我很惊讶没有人提及

id <user>


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

评论


因为-与标题相反-提问者想知道给定组中的用户,而不是问题中详细说明的给定用户组。我现在改写标题以匹配内容。

–杜布
2015年11月9日,10:10

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

– Alex
2015年11月9日在10:11

#7 楼

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 ;}';done


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

更好地使用grep会考虑到/etc/group的语法:在第一个冒号之前是有效的组名。不考虑语法的普通grep可以(并且将)从文件中获取误导性匹配。使用正则表达式使grep完全匹配所需的内容:

group_name:password:GID:user_list


,或使用shell变量:

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


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

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


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

使用getent提出的另一个建议答案也可能是在Linux机器(与Debian一起,它是GNU libc的一部分)。但是,对此的快速检查显示它仅提供/etc/group的内容。

我(像大多数人一样)没有安装libuserslid,因此我无法评论它是否满足OP的条件。
还有id程序,它提供组信息。可能有人会对此进行扩展。

评论


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

–StéphaneChazelas
16年11月6日在21:54

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

–StéphaneChazelas
16年11月6日在21:56



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

–StéphaneChazelas
16年11月6日在22:01

#8 楼

像魅力一样工作:

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


评论


与@ARG接受的答案不同,此命令列出以作为其主要组的用户

–巴哈维克
17年7月7日在5:28



这应该是公认的答案

– Nikolay Nenov
17年6月8日在10:58

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

–伊凡(IvanVučica)
17-10-25在11:00

对于我而言,这工作不正常:我在一个小组中有4个成员,而sudo lid -g列出了8个。

– DKroot
18年7月25日在15:54

#9 楼

有人会告诉您安装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 ""| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group ""|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
18年7月25日在15:58

#10 楼

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

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


#11 楼

 function members {

echo "$(getent group  | cut -d: -f1,2,3):$(getent passwd | cut -d: -f1,4 | grep $(getent group  | cut -d: -f3) | cut -d: -f1 | paste -sd ','):$(getent group  | cut -d: -f4)"

}
 


列出以“:”分隔的主要和次要成员。