web-dev-qa-db-fra.com

Liste tous les membres d'un groupe (Mac OS X)

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?

52
Meltemi

Vous pouvez utiliser:

dscacheutil -q group -a name admin

ou:

dscacheutil -q group -a name staff

etc.

38
duperuser

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:

  1. L'utilisateur PrimaryGroupID
  2. Listé dans le groupe GroupMembership
  3. UUID répertorié dans le groupe GroupMembers
  4. Appartenance héritée du groupe X en tant que membre du groupe Y répertorié dans le groupe X NestedGroups
  5. Adhésion calculée par le système

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)

61
Arne Stenström

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
9
Arne Stenström

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
7
Jay Brown

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!

4
William Jackson

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).

1
AmadeusDrZaius

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";
    }
}
0
Billy McCloskey