Comment lister tous les membres d'un groupe sous Linux (et éventuellement sous d'autres unités) ?
N'affiche pas les utilisateurs dont le groupe est le groupe par défaut.
Comment lister tous les membres d'un groupe sous Linux (et éventuellement sous d'autres unités) ?
Malheureusement, il n'existe pas, à ma connaissance, de bonne méthode portable pour y parvenir. 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 tous ceux qui ont été ajoutés à ce groupe par un mécanisme autre que les fichiers plats UNIX (c'est-à-dire LDAP, NIS, pam-pgsql, etc.).
Si je devais absolument faire cela moi-même, je le ferais probablement à l'envers : utilisez id
pour obtenir les groupes de chaque utilisateur sur le système (ce qui permettra d'extraire 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 chaque utilisateur sur le système. Comme mon site n'utilise que des fichiers plats et LDAP, je peux simplement obtenir une liste à partir des deux sites, mais ce n'est pas forcément le cas dans votre environnement.
Edit 2 : Quelqu'un m'a rappelé en passant que getent passwd
renvoie une liste de tous les utilisateurs du système, y compris ceux provenant de LDAP/NIS/etc, mais getent group
Cependant, il manquera toujours les utilisateurs qui ne sont membres que via l'entrée du groupe par défaut, ce qui m'a incité à écrire ce petit hack.
#!/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";
}
}
Merci à tous ceux qui ont répondu. Je cherchais un moyen portable de le faire. Votre information selon laquelle il n'existe pas de méthode facile et portable m'a été utile. Vous avez également donné plus de détails sur les circonstances, ce qui m'a aidé à comprendre le problème plus profondément, j'apprécie cela et j'ai choisi votre réponse comme étant la bonne.
Serait-il possible de faire don de votre script à la fondation Linux ? Nous sommes en 2012 et il n'y a toujours pas de moyen facile d'obtenir les membres d'un groupe. C'est la chose qui me frustre à propos de Linux.
J'ai ajouté une licence de type ISC pour vous, qui devrait être compatible avec à peu près n'importe quel groupe. N'hésitez pas à la soumettre là où vous pensez qu'elle sera acceptée.
Ce serait la meilleure façon, sauf que le couvercle n'est pas dans une installation standard de Debian. Dans Ubuntu, il se trouve dans le paquet optionnel libuser (ce n'est pas celui de id-utils qui porte le même nom). Je ne l'ai pas trouvé dans Debian :(
La commande suivante permet d'obtenir la liste de tous les utilisateurs appartenant à <your_group_name>
mais seulement ceux qui sont gérés par /etc/group
base de données, et non LDAP, NIS, etc. Il est également fonctionne uniquement pour les groupes secondaires il ne listera pas les utilisateurs dont le groupe est défini comme primaire puisque le groupe primaire est stocké en tant que GID
(numéro d'identification du groupe) dans le fichier /etc/passwd
.
awk -F: '/^groupname/ {print $4;}' /etc/group
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
@Silmari89, Pas s'il veut le faire de manière programmatique.
2 votes
Je suis nouveau ici, j'ai découvert l'existence de SF juste après avoir posé ma question. Je suis d'accord pour dire qu'elle appartient soit à SF, soit à SO.
5 votes
Bien sûr, il existe maintenant une solution programmatique, ce qui pourrait être justifié dans ce cas également.