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"
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.
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
où 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.
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)
groupmems -g nom de groupe -l
répertorie tous les utilisateurs du groupe nommé.
Je suis surpris que personne n'ait mentionné
id <user>
Cette commande donnera une liste des groupes dans lesquels se trouve l'utilisateur.
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>
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
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.
Fonctionne comme un charme:
cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
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
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 ":"