Comment savoir quels utilisateurs font partie d'un groupe sous Linux?

68

J'ai récemment créé de nouveaux utilisateurs et les ai assignés à certains groupes. Je me demandais s'il y avait une commande qui montre tous les utilisateurs assignés à un certain groupe? J'ai essayé d'utiliser la commande 'groups', mais chaque fois que je l'utilise, il est écrit 'groupes: non trouvé'

Jess Louise
la source
3
C'est la groupscommande. Il est peu probable que vous ne l’ayez pas sous Linux, car il fait partie de coreutils.
Thomas Dickey
@ThomasDickey Mais c'est possible - comme sur certains NAS.
Thomas W.

Réponses:

43

Vous pouvez utiliser grep:

grep '^group_name_here:' /etc/group

Cela répertorie uniquement les membres supplémentaires du groupe, pas l'utilisateur qui a ce groupe comme groupe principal. Et il ne trouve que les groupes locaux, pas les groupes d'un service réseau tel que LDAP.

ARG
la source
6
Ne fonctionne pas avec l'authentification centralisée.
Maxim Egorushkin
1
Cela pourrait être très déroutant probablement à cause de la différence primaire / secondaire. Je pense que cela devrait être évité au profit de sudo lid -g {group}.J'ai un système où cette réponse répertorie 8 utilisateurs d'un groupe alors que les sudo lid -g {group}listes 10.
DKroot
Voir la getentréponse de @Murray Jensen ci
scrutari
84

Je préfère utiliser la commande getent ...

Étant donné que getent utilise le même service de noms que le système, il affichera toutes les informations, y compris celles obtenues à partir de sources d'informations réseau telles que LDAP.

Donc, pour un groupe, vous devriez utiliser ce qui suit ...

getent group name_of_group

name_of_group est remplacé par le groupe que vous souhaitez rechercher. Notez que cela ne retourne que les membres supplémentaires du groupe, il n'inclut pas les utilisateurs qui ont ce groupe comme groupe principal.

Il y a beaucoup d'autres recherches que vous pouvez faire ... passwdétant une autre utile, vous aurez besoin de lister les groupes principaux.

Murray Jensen
la source
1
Les autres réponses ne s'appliquent pas si vous n'êtes pas administrateur et que les informations sur le groupe sont stockées sur un autre serveur.
Andrés Alcarraz
1
Cela pourrait être très déroutant probablement à cause de la différence primaire / secondaire. Je pense que cela devrait être évité au profit de sudo lid -g {group}.J'ai un système où cette réponse répertorie 8 utilisateurs d'un groupe alors que les sudo lid -g {group}listes 10.
DKroot
12

Plus facile à faire groups [username]

Si vous voulez lister tous les utilisateurs locaux et leurs groupes locaux, vous pouvez faire

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

Si vous obtenez "groupes: commande non trouvée", il est probable que vous ayez modifié votre chemin d'accès environnemental pour le pire, pour le réinitialiser PATH=$(getconf PATH)

ZN13
la source
Cela fonctionne pour un groupe particulier si | grep {group}est ajouté et donne la réponse correcte contrairement à getent group name_of_groupougrep '^group_name_here:' /etc/group
DKroot
1
Au lieu de cat /etc/passwd, vous devriez utiliser gentent passwdpour que les utilisateurs de nis / ldap soient toujours listés. Le seul inconvénient est que cela peut prendre un certain temps.
Brian Minton
8
groupmems -g nomgroupe -l

répertorie tous les utilisateurs du groupe nommé.

utilisateur198963
la source
Notez que cela groupmemsfait partie des ombres utiles utilisées sur la plupart des distributions Linux, mais groupmemsest actuellement absent de Debian et de ses dérivés (un bogue corrigé mais non inclus dans aucune version à ce jour (à la date de nov 2016))
Stéphane Chazelas
2
Notez également que groupmemsne traite que les groupes présents /etc/group(pas ceux de LDAP ou d’une autre base de données d’utilisateurs) et nécessite les privilèges de superutilisateur car il essaie d’ouvrir / etc / gshadow.
Stéphane Chazelas
Malgré les mises en garde mentionnées ci-dessus, cette commande est idéale dans certaines situations car elle ne nécessite pas d'analyse supplémentaire du résultat (ie cutet amis).
Bonh
Cela pourrait être très déroutant probablement à cause de la différence primaire / secondaire. Je pense que cela devrait être évité en faveur de sudo lid -g {group}. J'ai un système où cette réponse répertorie 8 utilisateurs d'un groupe alors que les sudo lid -g {group}listes 10.
DKroot
6

Je suis surpris personne n'a mentionné

id <user>

Cette commande donnera une liste des groupes dans lesquels se trouve l'utilisateur.

Alex
la source
3
Parce que - contrairement au titre - le questionneur voulait connaître les utilisateurs d'un groupe donné, pas les groupes d'un utilisateur donné, comme détaillé dans la question. J'ai maintenant reformulé le titre pour qu'il corresponde au contenu.
Dubu
Aaah, je vois. J'aurais dû mieux lire le texte de la question. Merci.
Alex
4

groupsLa commande imprime les appartenances à un groupe pour un utilisateur. Vous pouvez utiliser la lidcommande pour lister les utilisateurs dans un groupe tel que:

# lid -g <groupname>
Kadir
la source
4
lidfait partie de libuser, qui n'est pas installé par défaut sur de nombreuses distributions.
Chris Down
2

OP a formulé la question pour exclure la possibilité d'utiliser la commande groups . Comme cela fait partie de coreutils sur Linux, soit (a) il a été supprimé, soit (b) OP saisit le nom de façon incorrecte.

OP aurait pu utiliser groupscomme ceci, par exemple:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

Une réponse suggérée juste grep pour le nom du groupe dans /etc/group. Parfois, cela fonctionne comme prévu.

Une utilisation légèrement meilleure de grep prend en compte la syntaxe de /etc/group:

group_name:password:GID:user_list

de sorte que seule la partie précédant les deux points est un nom de groupe valide. Un simple grep sans égard à la syntaxe peut (et va) chercher des correspondances trompeuses dans le fichier. Utilisez des expressions régulières pour que le grep corresponde exactement à ce qui est nécessaire:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

ou en utilisant une variable shell:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

Cependant, cela ne répertorie que ceux qui ne font pas partie d'un groupe par défaut . Pour ajouter ceux , vous devez prendre en compte le fichier de mot de passe, par exemple, en extrayant le numéro ID de groupe à partir /etc/group, et l' impression des utilisateurs dont le groupe par défaut correspond à partir /etc/passwd, par exemple,

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

Vous pouvez faire la même chose en utilisant seulement grep et sed, mais c'est plus de travail que d'utiliser awk.

Une autre réponse suggérée a proposé d’utiliser getent, qui est probablement aussi sur une machine Linux (avec Debian, cela fait partie de GNU libc). Cependant, une vérification rapide montre que seul le /etc/groupcontenu est fourni .

Je (comme la plupart des gens) n’ai pas libusersou n’ai pas été lidinstallé, je ne peux donc pas dire s’il répond aux conditions d’OP.

Il y a aussi le idprogramme, qui donne des informations sur le groupe. Quelqu'un pourrait développer cela comme une réponse possible.

Thomas Dickey
la source
Ou simplement, sed -n "s/^$groupname:.*://p" /etc/groupmais cela pourrait quand même générer des résultats erronés si le nom de groupe contient des opérateurs RE ( .par exemple, ce n'est pas rare dans les noms de groupe).
Stéphane Chazelas
GNU getentinterrogera également LDAP / NIS ... mais peut-être pas quand l'énumération est explicitement désactivée pour la base de données du groupe.
Stéphane Chazelas
Notez que groupscela n’aidera pas, car il répertorie les groupes dont un utilisateur est membre, par opposition à la liste des membres d’un groupe donné.
Stéphane Chazelas
2

Fonctionne comme un charme:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Bhavik
la source
Contrairement à la réponse acceptée de @ARG, cette commande répertorie les utilisateurs du groupe principal <groupename>
Bhavik
cela devrait être la réponse acceptée
Nikolay Nenov
1
Je ne suis pas d'accord. Parce qu'il lit les utilisateurs dans / etc / passwd, cela ne fonctionnera pas avec les autres modules nsswitch qui accèdent à LDAP, etc.
Ivan Vučica
Cela ne fonctionnait pas correctement pour moi: j'ai 4 membres dans un groupe alors que les sudo lid -glistes sont 8. @Bhavik La réponse acceptée n'est pas correcte non plus.
DKroot
2

Certains vous diront d'installer libuser (pour 'lid') ou des membres (pour 'membres'). Mais en s’appuyant sur la réponse https://unix.stackexchange.com/a/349648/77959 qui traitait ce problème d’appartenance à un groupe de connexion, j’ai trouvé un autre groupe non couvert par ce script. Alors, voici le meilleur des deux approches combinées:

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi
flowtron
la source
Cela a fonctionné correctement sur mon système contrairement aux réponses getentou grep'^group_name_here:' /etc/group
DKroot
0

Cette modification de l'approche user3717722 listera les membres du groupe dans une base de données NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Holger Foersterling
la source