getent group <groupname>;
Es portátil tanto en Linux como en Solaris, y funciona con archivos de contraseña/grupo local, NIS y configuraciones LDAP.
Desafortunadamente, no existe una forma buena y portátil de hacer esto que yo sepa. Si intenta analizar /etc/group, como sugieren otros, perderá a los usuarios que tienen ese grupo como su grupo principal y a cualquiera que se haya agregado a ese grupo a través de un mecanismo que no sea archivos planos de UNIX (es decir, LDAP, NIS, pam-pgsql, etc.).
Si tuviera que hacer esto yo mismo, probablemente lo haría al revés:use id
para obtener los grupos de cada usuario en el sistema (que extraerá todas las fuentes visibles para NSS), y use Perl o algo similar para mantener una tabla hash para cada grupo descubierto, anotando la membresía de ese usuario.
Editar:Por supuesto, esto te deja con un problema similar:cómo obtener una lista de todos los usuarios del sistema. Dado que mi ubicación solo usa archivos planos y LDAP, solo puedo obtener una lista de ambas ubicaciones, pero eso puede o no ser cierto para su entorno.
Edición 2:alguien de pasada me recordó que getent passwd
devolverá una lista de todos los usuarios del sistema, incluidos los de LDAP/NIS/etc., pero getent group
aún extrañaré a los usuarios que son miembros solo a través de la entrada de grupo predeterminada, por lo que me inspiró a escribir este truco rápido.
#!/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 ([email protected] or [email protected])
#
# 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";
}
}