К сожалению, нет хорошего, портативного способа сделать это, о котором я знаю. Если вы попытаетесь проанализировать / etc / group, как предлагают другие, вы будете скучать по пользователям, у которых эта группа является основной, и по всем, кто был добавлен в эту группу с помощью механизма, отличного от плоских файлов UNIX (например, LDAP, NIS, pam-pgsql и т. д.).
Если бы мне абсолютно необходимо было сделать это самому, я бы, вероятно, сделал это наоборот: используйте id
, чтобы получить группы всех пользователей в системе (которые будут извлекать все источники, видимые для NSS), и использовать Perl или что-то похожее на ведение хеш-таблицы для каждой обнаруженной группы, отмечая членство этого пользователя.
Edit: Конечно, это оставляет вас с похожей проблемой: как получить список каждого пользователя в системе. Поскольку мое местоположение использует только плоские файлы и LDAP, я могу просто получить список из обоих местоположений, но это может или не может быть правдой для вашей среды.
Редактировать 2: Кто-то мимоходом напомнил мне, что getent passwd
вернет список всех пользователей в системе, включая пользователей из LDAP / NIS / и т. Д., , но 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";
}
}