getent group <groupname>;
Il est portable sous Linux et Solaris et fonctionne avec les fichiers de groupe/mot de passe locaux, les configurations NIS et LDAP.
Malheureusement, à ma connaissance, il n'y a pas de bon moyen portable de le faire. Si vous essayez d'analyser /etc/group, comme d'autres le suggèrent, vous manquerez les utilisateurs qui ont ce groupe comme groupe principal et toute personne qui a été ajoutée à ce groupe via un mécanisme autre que les fichiers plats UNIX (c'est-à-dire LDAP, NIS, pam-pgsql, etc.).
Si je devais absolument le faire moi-même, je le ferais probablement à l'envers :utilisez id
pour obtenir les groupes de chaque utilisateur sur le système (qui extraira toutes les sources visibles par NSS), et utiliser Perl ou quelque chose de similaire pour maintenir une table de hachage pour chaque groupe découvert en notant l'appartenance de cet utilisateur.
Edit :Bien sûr, cela vous laisse avec un problème similaire :comment obtenir une liste de tous les utilisateurs du système. Étant donné que mon emplacement utilise uniquement des fichiers plats et LDAP, je peux simplement obtenir une liste des deux emplacements, mais cela peut être vrai ou non pour votre environnement.
Edit 2 :Quelqu'un m'a rappelé au passage que getent passwd
renverra une liste de tous les utilisateurs du système, y compris ceux de LDAP/NIS/etc., mais getent group
Les utilisateurs qui sont membres uniquement via l'entrée de groupe par défaut manqueront toujours, ce qui m'a inspiré pour écrire ce hack rapide.
#!/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";
}
}