Answers:
您可以使用grep:
grep '^group_name_here:' /etc/group
这仅列出补充组成员资格,而不列出以该组为主要组的用户。并且它仅查找本地组,而不查找来自LDAP等网络服务的组。
sudo lid -g {group}
。我有一个系统,该答案在一个组中列出了8个用户,而在sudo lid -g {group}
列表中列出了10个用户
getent
下面@Murray Jensen的回答
我更喜欢使用getent命令...
由于getent使用与系统相同的名称服务,因此getent将显示所有信息,包括从网络信息源(例如LDAP)获得的信息。
因此,对于一个小组,您应该使用以下内容...
getent group name_of_group
将name_of_group替换为要查找的组。请注意,此操作仅返回补充组成员身份,不包括以该组为主要组的用户。
您还可以进行很多其他查找,这passwd
是另一种有用的查找,您需要列出主要组。
sudo lid -g {group}
。我有一个系统,该答案在组中列出了8个用户,而在sudo lid -g {group}
列表中列出了10个用户
容易做 groups [username]
如果要列出所有本地用户及其本地组,可以执行
cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups
如果显示“ groups:not found”,则可能是您编辑了更糟糕的环境路径,以重置路径 PATH=$(getconf PATH)
| grep {group}
添加了该群体),并且给出的答案不像getent group name_of_group
或grep '^group_name_here:' /etc/group
cat /etc/passwd
您应该使用而不是gentent passwd
来列出nis / ldap中的用户。唯一的缺点是它可能需要一段时间。
groupmems -g 组名 -l
列出命名组中的所有用户。
groupmems
是大多数Linux发行版上使用的Shadow utils的一部分,但是groupmems
Debian和衍生产品目前不存在(现已修复了一个错误,但尚未包含在任何发行版中(截至2016年11月))
groupmems
仅处理其中的组/etc/group
(而不处理LDAP或其他用户数据库中的组),并且在尝试打开/ etc / gshadow时需要超级用户特权。
cut
和朋友)进行额外的分析。
sudo lid -g {group}
。我有一个系统,其中此答案列出了一个组中的8个用户,但sudo lid -g {group}
列出了10个
我很惊讶没有人提到
id <user>
此命令将提供用户所在的组的列表。
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运算符(.
例如,在组名中并不罕见),那仍然可能报告错误的结果。
getent
还将查询LDAP / NIS ...尽管在为组数据库显式禁用枚举时可能不会查询。
groups
将无济于事,因为它列出了给定用户所属的组,而不是给定组的成员列表。
奇迹般有效:
cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
sudo lid -g
名单8。@Bhavik接受的答案也不正确。
有人会告诉您安装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
groups
命令。由于Linux是coreutils的一部分,因此您不太可能在Linux上没有它。