274 votes

Comment dresser la liste de tous les utilisateurs d'un groupe Linux ?

Comment lister tous les membres d'un groupe sous Linux (et éventuellement sous d'autres unités) ?

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.

242voto

Josh H Points 883
getent group <groupname>;

Il est portable sous Linux et Solaris, et fonctionne avec des fichiers locaux de groupes et de mots de passe, des configurations NIS et LDAP.

44 votes

N'affiche pas les utilisateurs dont le groupe est le groupe par défaut.

104voto

Zed Points 1571

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";
    }
}

3 votes

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.

2 votes

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.

6 votes

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.

40voto

gnperumal Points 51

Utilisez Python pour dresser la liste des membres d'un groupe :

python -c "import grp ; print grp.getgrnam('GROUP_NAME')[3]"

Voir https://docs.python.org/2/library/grp.html

1 votes

Malheureusement, il ne signale pas les membres des groupes de domaines.

39voto

Memo Points 151
lid -g groupname | cut -f1 -d'('

7 votes

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 :(

0 votes

Cela a fonctionné pour moi sur Scientific Linux

0 votes

Sur Debian Wheezy, le couvercle se trouve également sur le paquet libuser

16voto

Didier Trosset Points 17949

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

7 votes

N'affiche pas les utilisateurs dont le groupe est le groupe par défaut.

3 votes

Ne vérifie pas NIS et LDAP.

Prograide.com

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.

Powered by:

X