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


当前回答

getent group groupname | awk -F: '{print $4}' | tr , '\n'

这有三个部分:

1 - getent group groupname显示“/etc/group”文件中组的行。替代cat /etc/group | grep groupname。

2 - awk只打印用','分隔的单行中的成员。

3 - tr将','替换为新行,并在一行中打印每个用户。

4 -可选:如果用户太多,你也可以使用另一个管道排序。

问候

其他回答

使用Python列出组成员:

import grp;打印grp.getgrnam (GROUP_NAME)[3]”

参见https://docs.python.org/2/library/grp.html

lid -g groupname | cut -f1 -d'(' 

在UNIX(与GNU/Linux相反)中,有listusers命令。有关listusers,请参阅Solaris手册页。

注意,这个命令是开源家宝项目的一部分。我认为它在GNU/Linux中是缺失的,因为RMS不相信组和权限。: -)

我所做的与上面的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";

下面是另一个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]])"