如何在Linux(可能还有其他unix)中列出一个组的所有成员?


当前回答

下面是另一个Python一行程序,它考虑了用户的默认组成员(来自/etc/passwd)以及组数据库(/etc/group)

python -c "import grp,pwd; print set(grp.getgrnam('mysupercoolgroup')[3]).union([u[0] for u in pwd.getpwall() if u.pw_gid == grp.getgrnam('mysupercoolgroup')[2]])"

其他回答

再加上grep和tr:

$ grep ^$GROUP /etc/group | grep -o '[^:]*$' | tr ',' '\n'
user1
user2
user3

你可以在一个命令行中完成:

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

上面的命令列出了所有使用groupname作为主组的用户

如果还希望列出具有groupname的用户作为次要组,则使用以下命令

getent group <groupname> | cut -d: -f4 |  tr ',' '\n'

下面的命令将列出属于<your_group_name>的所有用户,但只列出由/etc/group数据库管理的用户,不包括LDAP、NIS等。它也只适用于次要组,它不会列出将该组设置为主要组的用户,因为主要组存储为/etc/passwd.文件中的GID(数字组ID)

grep <your_group_name> /etc/group

我所做的与上面的perl代码类似,但是用本地perl函数替换了getent和id。它要快得多,应该可以跨不同的*nix口味工作。

#!/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";

下面的命令将列出属于<your_group_name>的所有用户,但只列出由/etc/group数据库管理的用户,不包括LDAP、NIS等。它也只适用于次要组,它不会列出将该组设置为主要组的用户,因为主要组存储为/etc/passwd.文件中的GID(数字组ID)

awk -F: '/^groupname/ {print $4;}' /etc/group