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

推荐答案

不幸的是,据我所知,没有一种好的、便携的方法可以做到这一点.如果像其他人建议的那样try 解析/etc/group,您将错过将该组作为主要组的用户,以及通过UNIX平面文件以外的机制(即LDAP、NIS、pam pgsql等)添加到该组的任何人.

如果我一定要自己做这件事,我可能会反过来做:使用id来获取系统上每个用户的组(这将获取NSS可见的所有源代码),并使用Perl或类似的工具为发现的每个组维护一个哈希表,并注明该用户的成员身份.

编辑:当然,这会给你带来一个类似的问题:如何获得系统中每个用户的列表.因为我的位置只使用平面文件和LDAP,所以我只能从这两个位置获得一个列表,但对于您的环境来说,这可能是真的,也可能不是真的.

编辑2:有人顺便提醒我,getent passwd将返回系统上所有用户的列表,包括来自LDAP/NIS/等的用户,but getent group仍将错过仅通过默认组条目作为成员的用户,因此启发我写这篇快速黑客文章.


#!/usr/bin/perl -T
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Copyright © 2010-2013 by Zed Pobre (zed@debian.org or zed@resonant.org)
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#

use strict; use warnings;

$ENV{"PATH"} = "/usr/bin:/bin";

my $wantedgroup = shift;

my %groupmembers;
my $usertext = `getent passwd`;

my @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;

foreach my $userid (@users)
{
    my $usergrouptext = `id -Gn $userid`;
    my @grouplist = split(' ',$usergrouptext);

    foreach my $group (@grouplist)
    {
        $groupmembers{$group}->{$userid} = 1;
    }
}

if($wantedgroup)
{
    print_group_members($wantedgroup);
}
else
{
    foreach my $group (sort keys %groupmembers)
    {
        print "Group ",$group," has the following members:\n";
        print_group_members($group);
        print "\n";
    }
}

sub print_group_members
{
    my ($group) = @_;
    return unless $group;

    foreach my $member (sort keys %{$groupmembers{$group}})
    {
        print $member,"\n";
    }
}

Linux相关问答推荐

git别名函数可以用单引号写吗?

UTF-8输入和使用XGetICValues

Git - 打印以不同编码混合的文件

不带空格的字符串连接形成文件路径

加载ELF64头文件为什么会导致分段错误?

使用 AWK 过滤 Linux 输出

使用 sed 从文本文件中删除特定字符串

进程Forking 后 pthread_key_create() 生成的密钥会发生什么?

CHMOD 755 与 750 权限集之间的差异

在 Bash 中从最后到第一个输出文件行

为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

如何判断 Ubuntu 12.04 LTS 上是否安装了多个版本的 PHP?

如何在 linux 'screen' 中搜索任何单词

grep 时间命令输出

在亚马逊 ec2 linux 微型实例上的 virtualenv 中安装 scipy 时遇到问题

在 Linux 上的进程之间传递消息的最快技术?

如何搜索文件并将它们压缩到一个 zip 文件中

解压tar tar.bz2 文件报错

网络共享文件夹上的 GIT 存储库中的并发性

如何将 ISO8859-15 转换为 UTF8?