web-dev-qa-db-fra.com

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

J'ai récemment créé de nouveaux utilisateurs et les ai affectés à certains groupes. Je me demandais s'il y avait une commande qui montre tous les utilisateurs affectés à un certain groupe? J'ai essayé d'utiliser la commande "groups" mais chaque fois que j'utilise ceci, il dit "groups: not found"

76
Jess Louise

Vous pouvez utiliser grep:

grep '^group_name_here:' /etc/group

Cela répertorie uniquement les appartenances aux groupes supplémentaires, 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.

48
ARG

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

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

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

getent group name_of_group

name_of_group est remplacé par le groupe que vous souhaitez rechercher. Notez que cela renvoie uniquement les appartenances aux groupes supplémentaires, 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, dont vous aurez besoin pour lister les groupes primaires.

95
Murray Jensen

Plus facile à faire groups [username]

Si vous souhaitez répertorier tous les utilisateurs locaux et leurs groupes locaux, vous pouvez le faire

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

Si vous obtenez "groups: command not found", il est probable que vous ayez modifié votre chemin environnemental pour le pire, pour réinitialiser votre chemin faire PATH=$(getconf PATH)

13
ZN13
groupmems -g nom de groupe -l

répertorie tous les utilisateurs du groupe nommé.

8
user198963

Je suis surpris que personne n'ait mentionné

id <user>

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

7
Alex

La commande groups imprime les appartenances aux groupes pour un utilisateur. Vous pouvez utiliser la commande lid pour répertorier les utilisateurs d'un groupe comme:

# lid -g <groupname>
6
Kadir

Certains vous diront d'installer libuser (pour "couvercle") ou membres (pour "membres"). Mais en s'appuyant sur la réponse https://unix.stackexchange.com/a/349648/77959 qui a géré ce problème avec l'appartenance au groupe de connexion J'ai trouvé un autre groupe non couvert par ce script. Donc, 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
2
flowtron

OP a formulé la question pour exclure la possibilité d'utiliser la commande groups . Comme cela fait partie de coreutils sous Linux, soit (a) il a été supprimé, soit (b) OP a mal saisi le nom.

OP aurait pu utiliser groups comme 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 est simplement 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 avant le premier deux-points est un nom de groupe valide. Un simple grep sans égard à la syntaxe peut (et va) détecter des correspondances trompeuses dans le fichier. Utilisez des expressions régulières pour que la 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 sont pas dans 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 d'identification de groupe de /etc/group, et en imprimant les utilisateurs dont le groupe par défaut correspond à partir de /etc/passwd, par exemple.,

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

Vous pourriez faire la même chose en utilisant juste grep et sed, mais c'est plus de travail qu'en utilisant awk.

Une autre réponse suggérée propose d'utiliser getent , qui est également susceptible d'être sur une machine Linux (avec Debian, il fait partie de GNU libc). Cependant, une vérification rapide de cela montre qu'il ne fournit que le /etc/group contenu.

Je (comme la plupart) n'ai pas libusers ou lid installé, donc je ne peux pas dire s'il satisfait aux conditions OP.

Il existe également le programme id, qui donne des informations sur les groupes. Quelqu'un pourrait développer cela comme une réponse possible.

2
Thomas Dickey

Fonctionne comme un charme:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
2
Bhavik

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
0
function members {

echo "$(getent group $1 | cut -d: -f1,2,3):$(getent passwd | cut -d: -f1,4 | grep $(getent group $1 | cut -d: -f3) | cut -d: -f1 | paste -sd ','):$(getent group $1 | cut -d: -f4)"

}

Répertorie les membres principaux et secondaires séparés par un ":"

0
Julie Yang