¿Cómo enumerar a todos los usuarios de un grupo de Linux?

Resuelto user323094 asked hace 14 años • 20 respuestas

¿Cómo enumero todos los miembros de un grupo en Linux (y posiblemente en otros Unices)?

user323094 avatar May 14 '10 22:05 user323094
Aceptado
getent group <groupname>;

Es portátil tanto en Linux como en Solaris, y funciona con archivos de grupo/contraseña locales, configuraciones NIS y LDAP.

Josh H avatar Nov 18 '2011 12:11 Josh H

Desafortunadamente, que yo sepa, no existe una forma buena y portátil de hacer esto. Si intenta analizar /etc/group, como sugieren otros, perderá a los usuarios que tienen ese grupo como su grupo principal y a cualquiera que haya sido agregado a ese grupo a través de un mecanismo distinto a los archivos planos UNIX (es decir, LDAP, NIS, pam-pgsql, etcétera).

Si tuviera que hacer esto yo mismo, probablemente lo haría a la inversa: usarlo idpara obtener los grupos de cada usuario en el sistema (lo que extraerá todas las fuentes visibles para NSS) y usar Perl o algo similar para mantener un hash. tabla para cada grupo descubierto observando 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 utiliza sólo archivos planos y LDAP, puedo obtener una lista de ambas ubicaciones, pero eso puede ser cierto o no para su entorno.

Edición 2: Alguien de pasada me recordó que getent passwddevolverá una lista de todos los usuarios en el sistema, incluidos los de LDAP/NIS/etc., pero getent group aún así extrañará a los usuarios que son miembros solo a través de la entrada de grupo predeterminada, por lo que eso me inspiró a Escribe 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";
    }
}
Zed avatar May 14 '2010 15:05 Zed

Utilice Python para enumerar los miembros del grupo:

python -c "importar grupo; imprimir grp.getgrnam('NOMBRE_GRUPO')[3]"

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

Narayanaperumal Gurusamy avatar Aug 29 '2012 07:08 Narayanaperumal Gurusamy
lid -g groupname | cut -f1 -d'(' 
Memo avatar Aug 15 '2011 16:08 Memo