J'ai essayé de chercher sur Google mais je ne suis allé nulle part. Comment puis-je lister tous les membres d'un groupe appelé mygroup
à partir de la ligne de commandesous OS X?
$ dscl . list /groups
me donnera tous les groupes ... mais comment puis-je voir les membres de chaque groupe?
Vous pouvez utiliser:
dscacheutil -q group -a name admin
ou:
dscacheutil -q group -a name staff
etc.
Aucune commande standard ne répertorie tous les membres d'un groupe sous OS X. Voici donc une fonction Shell qui le fait:
members () { dscl . -list /Users | while read user; do printf "$user "; dsmemberutil checkmembership -U "$user" -G "$*"; done | grep "is a member" | cut -d " " -f 1; };
Copiez la ligne de commande ci-dessus dans le terminal, puis tapez members mygroup
(où mygroup est le nom d'un groupe existant).
Quelques explications pour ceux qui sont intéressés:
Il y a cinq différentes façons (à ma connaissance) qu'un utilisateur puisse appartenir à un groupe sous OS X. La commande dscl . -read /Groups/mygroup GroupMembership
ne garantit pas la sortie de tout, ni même de tout, de mygroup} membres de _, car l'appartenance provient également de identifiant de groupe principal, d'adhésion par utilisateur UUID , héritage de l'appartenance à un groupe, et d'adhésions calculées par le système , tel que le groupe tout le monde.
Donc, plutôt que d'essayer de garder une trace de tout cela, il semble être une meilleure idée de vérifier simplement la composition de chaque utilisateur du système (en utilisant dsmemberutil ), et c'est ce que font la fonction Shell et le script ci-dessous.
Ce script members équivaut à la fonction Shell, mais permet une gestion plus agréable des entrées non valides:
#!/bin/bash
# members -- list all members of a group
#
# SYNOPSIS
# members groupname
#
# http://superuser.com/questions/279891/list-all-members-of-a-group-mac-os-x
# by Arne
# Expected to work on Mac OS 10.5 and newer, tested on 10.6 and 10.7.
# It could be rewritten to work on 10.4 by using "dseditgroup -o checkmember"
# instead of "dsmemberutil checkmembership".
# By using dseditgroup, the script could also be extended to handle
# other Directory Service nodes than the default local node.
#
the_group="$1"
# Input check and usage
if [[ $# != 1 || $1 == -* || $1 =~ [[:space:]] ]]; then
echo "Usage: ${0##*/} groupname" >&2
echo "Lists all members of the group." >&2
exit 64
Elif (dsmemberutil checkmembership -U root -G "$the_group" 2>&1 \
| grep "group .* cannot be found") >&2; then
exit 1
fi
# Check every user
exec dscl . -list /Users \
| while read each_username
do
printf "$each_username "
dsmemberutil checkmembership -U "$each_username" -G "$the_group"
done \
| grep "is a member" | cut -d " " -f 1
# eof
Informations complémentaires:
Les cinq façons d'être membre du groupe sont:
Ceux-ci peuvent être explorés avec des commandes comme dscl . -read /Groups/somegroup
Exemple de 4 : l'appartenance au groupe d'opérateurs d'impression __lpoperator_ est héritée par les membres du groupe Print Administrator __lpadmin_ et l'appartenance à ce groupe est héritée par les membres de la admin) groupe.
Exemple de 5 :
$ dscl . -read /Groups/netaccounts Comment
Comment:
Group membership calculated by system
Accounts from a remote directory server
$
VOIR ÉGALEMENT
id (1) , dscl (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , uuid (3)
Remarque: c'était ma réponse initiale, écrite avant de réaliser cette réponse donne toujours un résultat incomplet . (Par exemple, il ne trouve aucun membre du tout le monde groupe!) Donc J'ai écrit une meilleure réponse, qui inclut un script qui répertorie tous les membres d'un groupe sous OS X .
La propriété GroupMembership de mygroup _ peut être imprimée avec dscl comme ceci:
dscl . -read /Groups/mygroup GroupMembership
Mais cela ne garantit pas la sortie de tous (ou même de tous) des membres du groupe. Ce qui manque, ce sont les utilisateurs qui sont membres du groupe uniquement en le prenant comme leur ID du groupe principal.
Les comptes de connexion classiques, dont le groupe principal est personnel (groupe 20), constituent un exemple courant, mais qui ne figurent pas dans la propriété GroupMembership du groupe personnel.
Ces utilisateurs peuvent être trouvés en recherchant le _ ID du groupe principal (gid) numérique comme dans cet exemple pour le groupe personnel (gid 20):
dscl . -list /Users PrimaryGroupID | grep " 20$"
et le gid numérique (PrimaryGroupID) de mygroup est trouvé par:
dscl . -read /Groups/mygroup PrimaryGroupID
Pour obtenir tous les groupes dans lesquels se trouve un utilisateur , vous pouvez utiliser les éléments suivants:
id -nG <username>
Exemple de sortie:
staff com.Apple.sharepoint.group.1 everyone localaccounts _appserverusr admin _appserveradm _lpadmin _appstore _lpoperator _developer com.Apple.access_ftp com.Apple.access_screensharing com.Apple.access_ssh
En utilisant la commande ci-dessus, il est possible d’obtenir tous les utilisateurs appartenant à un groupe :
OSX:
group=staff;
for i in $(dscl . list /users);
do [[ $(id -nG $i | grep $group) ]] && echo $i;
done
Unix :
group=Sudo;
# This only outputs lines that match a username (from the start of line to a colon must not be a hash indicating a comment)
for i in $(grep -oE "^[^#:]+" /etc/passwd);
do [[ $(id -nG $i | grep $group) ]] && echo $i;
done
dscl . -read /Groups/[groupname] | grep GroupMembership
ATTENTION: La commande ci-dessus n'affiche pas toujours la liste complète de TOUS les membres du groupe. Par exemple. pour le groupe "staff", vous n'obtenez que "root" en tant que membre du groupe, ce qui est incomplet. Pour le vérifier, utilisez l'une des commandes suivantes comme utilisateur par défaut (PAS "root"): id -Gn
OR groups
En conséquence, tous les groupes dont l'utilisateur connecté par défaut est membre s'affichent. L'un d'entre eux devrait être "personnel". Ainsi, outre "root", il y a plus de membres du groupe "staff", qui ne sont pas listés par la commande dscl . -read /Groups/[groupname] | grep GroupMembership
. Il en va de même pour la commande dscacheutil -q group -a name staff
qui vous suggère également que seul "root" est un membre du groupe "staff", ce qui est évidemment incomplet.
Arne Stenström a déjà fourni la seule méthode fiable pour obtenir réellement TOUS les membres d’un groupe dans le terminal sous OSX. Ceci utilise sa fonction Shell resp. son script shell. Les deux fonctionnent très bien!
Commande
Semblable à la réponse de @ duperuser, ce qui suit n’imprimera que les utilisateurs du groupe admin
avec des espaces entre eux:
dscacheutil -q group -a name admin | grep -e '^users:' | sed 's/users: //'
Sortie
L'exécution de la commande ci-dessus produira quelque chose comme ceci:
root your_username someone_else
Panne
La commande dscacheutil
permet d’interroger des informations sur différentes catégories du cache du service de répertoire du système. L'option -q
vous permet de spécifier la catégorie que vous souhaitez interroger. Les catégories disponibles sont groupe, hôte, montage, protocole, rpc, service et utilisateur. Nous interrogeons ensuite cette catégorie en spécifiant une paire clé-valeur avec l'option -a
. Dans ce cas, nous voulons répertorier le groupe dont la clé name
est égale à la valeur admin
. La commande dscacheutil
ci-dessus produit une sortie comme celle-ci:
name: admin
password: *
gid: 80
users: root yourusername
Ensuite, nous tubes ce texte dans grep
et choisissons la ligne contenant la chaîne users:
au début. L'option -e
permet à grep de reconnaître expressions régulières . Le caractère ^
spécifie que nous voulons que users:
soit au début de la ligne.
Cela nous donne
users: root yourusername
Enfin, nous passons cela à sed et remplaçons le texte users:
par la chaîne vide. Dans sed , la première lettre s
signifie substituer. Le texte entre la première paire de barres obliques (/users: /
) correspond à ce que nous voulons remplacer, et la prochaine paire de barres obliques (//
) correspond à ce que nous voulons remplacer (dans ce cas, rien).
Voici une implémentation de ce problème qui était dérivée à partir d'une implémentation dans un discussion connexe . La routine est quelque peu générique, avec un point d’accès au service d’annuaire pour toute plate-forme/architecture spécifique, afin de pouvoir être utilisée sans modification sur un réseau hétérogène. Nous avons installé un lien symbolique vers cet utilitaire nommé zed
. Les autres origines de cette implémentation sont mentionnées dans la section d'attribution du script. Cet outil est conçu pour être exécuté au moins sur OSX, HP-UX, Linux et SunOS, mais n'a pas été testé sur SunOS et HP-UX. Le script a été testé autant que possible sur Ubuntu Linux 12.04 et Mavericks OSX 10.9.1. La sortie de ce script correspond à la sortie de la première implémentation de script Shell pour ce problème et est donc considérée comme correcte.
#!/usr/bin/Perl
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Date: 12/30/2013
# Author: William H. McCloskey, Jr.
# Changes: Added logic to detect Host type & tailor subset of getent (OSX)
# Attribution:
# The logic for this script was directly lifted from Zed Pobre's work.
# See below for Copyright notice.
# The idea to use dscl to emulate a subset of the now defunct getent on OSX
# came from
# http://zzamboni.org/\
# brt/2008/01/21/how-to-emulate-unix-getent-with-macosxs-dscl/
# with an example implementation lifted from
# https://github.com/petere/getent-osx/blob/master/getent
#
# 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";
# Only run on supported $os:
my $os;
($os)=(`uname -a` =~ /^([\w-]+)/);
unless ($os =~ /(HU-UX|SunOS|Linux|Darwin)/)
{die "\$getent or equiv. does not exist: Cannot run on $os\n";}
my $wantedgroup = shift;
my %groupmembers;
my @users;
# Acquire the list of @users based on what is available on this OS:
if ($os =~ /(SunOS|Linux|HP-UX)/) {
#HP-UX & Solaris assumed to be like Linux; they have not been tested.
my $usertext = `getent passwd`;
@users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
};
if ($os =~ /Darwin/) {
@users = `dscl . -ls /Users`;
chop @users;
}
# Now just do what Zed did - thanks Zed.
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";
}
}