以下命令将列出属于 <your_group_name> 的所有用户,但仅列出由 /etc/group 数据库管理的用户,而不是LDAP,NIS等 . 它也是 works for secondary groups only ,它不会列出将该组设置为主要用户的用户,因为主要组存储为文件 /etc/passwd 中的 GID (数字组ID) .
awk -F: '/^groupname/ {print $4;}' /etc/group
3
以下shell脚本将遍历所有用户并仅打印属于给定组的用户名:
#!/usr/bin/env bash
getent passwd | while IFS=: read name trash
do
groups $name 2>/dev/null | cut -f2 -d: | grep -i -q -w "$1" && echo $name
done
true
用法示例:
./script 'DOMAIN+Group Name'
Note: 此解决方案将检查用户和组的NIS和LDAP(不仅是 passwd 和 group 文件) . 它还会考虑未添加到组但将组设置为主组的用户 .
Edit: 添加了针对罕见场景的修复,其中用户不属于具有相同名称的组 .
Edit: 以shell脚本的形式编写;添加 true 以@Max Chernyak aka hakunin建议以 0 状态退出;丢弃 stderr 以便偶尔跳过那些 groups: cannot find name for group ID xxxxxx .
#!/usr/bin/env perl
use strict;
my $arg=shift;
my %groupMembers; # defining outside of function so that hash is only built once for multiple function calls
sub expandGroupMembers{
my $groupQuery=shift;
unless (%groupMembers){
while (my($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell,$expire)=getpwent()) {
my $primaryGroup=getgrgid($gid);
$groupMembers{$primaryGroup}->{$name}=1;
}
while (my($gname,$gpasswd,$gid,$members)=getgrent()) {
foreach my $member (split / /, $members){
$groupMembers{$gname}->{$member}=1;
}
}
}
my $membersConcat=join(",",sort keys %{$groupMembers{$groupQuery}});
return "$membersConcat" || "$groupQuery Does have any members";
}
print &expandGroupMembers($arg)."\n";
#!/bin/bash
MYGROUP="user"
# get the group ID
MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`
if [[ $MYGID != "" ]]
then
# get a newline-separated list of users from /etc/group
MYUSERS=`grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`
# add a newline
MYUSERS=$MYUSERS$'\n'
# add the users whose default group is MYGROUP from /etc/passwod
MYUSERS=$MYUSERS`cat /etc/passwd |grep $MYGID | cut -d ":" -f1`
#print the result as a newline-separated list with no duplicates (ready to pass into a bash FOR loop)
printf '%s\n' $MYUSERS | sort | uniq
fi
18 回答
这将返回一个空格分隔的用户列表,我在脚本中使用它来填充数组 .
要么
不幸的是,我知道没有好的,可移植的方法来做到这一点 . 如果您尝试解析/ etc / group,正如其他人所建议的那样,您将错过将该组作为其主要组的用户以及通过UNIX平面文件以外的机制(即LDAP,NIS,已添加到该组)的任何人pam-pgsql等) .
如果我自己绝对必须这样做,我可能会反过来做:使用
id
来获取系统上每个用户的组(这会将所有源都提供给NSS),并使用Perl或类似的东西来维护发现每个组的哈希表,注意到该用户的成员身份 .编辑:当然,这会给您留下类似的问题:如何获取系统上每个用户的列表 . 由于我的位置仅使用平面文件和LDAP,因此我可以从两个位置获取列表,但这可能适用于您的环境,也可能不适用 .
编辑2:传递给我的人提醒我,
getent passwd
将返回系统上所有用户的列表,包括来自LDAP / NIS /等的用户,但getent group
仍然会遗漏仅通过默认组条目成员的用户,因此受到启发我写这个快速的黑客 .它可以在Linux和Solaris上移植,并且可以与本地组/密码文件,NIS和LDAP配置一起使用 .
使用Python列出组成员:
见https://docs.python.org/2/library/grp.html
以下命令将列出属于
<your_group_name>
的所有用户,但仅列出由/etc/group
数据库管理的用户,而不是LDAP,NIS等 . 它也不会列出将该组设置为主要用户的用户,因为主要组存储为文件/etc/passwd
中的GID
(数字组ID) .以下命令将列出属于
<your_group_name>
的所有用户,但仅列出由/etc/group
数据库管理的用户,而不是LDAP,NIS等 . 它也是 works for secondary groups only ,它不会列出将该组设置为主要用户的用户,因为主要组存储为文件/etc/passwd
中的GID
(数字组ID) .以下shell脚本将遍历所有用户并仅打印属于给定组的用户名:
用法示例:
Note: 此解决方案将检查用户和组的NIS和LDAP(不仅是
passwd
和group
文件) . 它还会考虑未添加到组但将组设置为主组的用户 .Edit: 添加了针对罕见场景的修复,其中用户不属于具有相同名称的组 .
Edit: 以shell脚本的形式编写;添加
true
以@Max Chernyak aka hakunin建议以0
状态退出;丢弃stderr
以便偶尔跳过那些groups: cannot find name for group ID xxxxxx
.您可以在一个命令行中执行此操作:
以上命令列出了将groupname作为主要组的所有用户
如果还要列出具有groupname作为其辅助组的用户,请使用以下命令
Zed's implementation should probably be expanded to work on some of the other major UNIX.
有人可以访问Solaris或HP-UX硬件吗?没有测试那些案件 .
如果有更好的方式来分享这个建议,请告诉我;我考虑了很多方法,这就是我提出的方法 .
我这样做与上面的perl代码类似,但用本机perl函数替换了getent和id . 它更快,应该适用于不同的* nix风格 .
只是一点点grep和tr:
有一个方便的Debian和Ubuntu包叫做“ members ”,它提供了这个功能:
这是一个脚本,它返回/ etc / passwd和/ etc / group中的用户列表,它不检查NIS或LDAP,但它确实显示将该组作为其默认组的用户在Debian 4.7和solaris 9上测试
或作为一个单行,你可以削减和从这里直接粘贴(更改第一个变量中的组名)
在UNIX(与GNU / Linux相对)中,有listusers命令 . 见Solaris man page for listusers .
请注意,此命令是开源Heirloom Project的一部分 . 我认为它相信组和权限 . :-)
这是一个非常简单的awk脚本,它考虑了其他答案中列出的所有常见陷阱:
我正在使用我的ldap启用设置,运行任何符合标准的getent和awk,包括solaris 8和hpux .
这有3个部分:
1 -
getent group groupname
显示"/etc/group"文件中组的行 .cat /etc/group | grep groupname
的替代品 .2 -
awk
print 's only the members in a single line separeted with ',' .3 -
tr
用新行替换's ','并连续打印每个用户 .4 - 可选:如果用户太多,您还可以使用带有
sort
的其他管道 .问候
我已经尝试了
grep 'sample-group-name' /etc/group
,它将根据示例here列出您指定的组的所有成员