Elenca tutti i membri di un gruppo (Mac OS X)


56

Ho provato a cercare su Google ma non sono arrivato da nessuna parte. Come posso elencare tutti i membri di un gruppo chiamato mygroupdalla riga di comando in OS X?

$ dscl . list /groupsmi porterà tutti i gruppi ... ma come posso vedere i membri di ciascun gruppo?

Risposte:


41

Puoi usare:

dscacheutil -q group -a name admin

o:

dscacheutil -q group -a name staff

eccetera.


Questo è il mio metodo preferito. Facile e accurato. Grazie!
— Prova TryAgain

Questa è un'ottima risposta poiché il 90% dei casi d'uso può essere risolto con questo e non con gli script più elaborati che sono stati pubblicati come risposte.
— Jake Gould,

Basta aggiungere questo come alias nel file di avvio della shell e puoi renderlo un comando di una sola parola più il nome del gruppo.
— Neil Monroe,

Quando ho provato "dscacheutil -q group" ho ricevuto 2 paragrafi per il gruppo "admin". I due hanno lo stesso nome, gid, ma un elenco di utenti diverso. Qualche idea? Grazie!
— Pollice d'oro,

Non necessariamente completo. dscacheutil -q group -a name adminmi ha dato solo 1 risultato, mentre lo script della shell della risposta accettata mi ha dato 2 risultati.
— Wisbucky,

64

Non esiste un comando standard che elenca tutti i membri di un gruppo in OS X, quindi ecco una funzione shell che lo fa:

members () { dscl . -list /Users | while read user; do printf "$user "; dsmemberutil checkmembership -U "$user" -G "$*"; done | grep "is a member" | cut -d " " -f 1; }; 

Copia la riga di comando sopra nel Terminale, quindi digita (dove mygroup è il nome di un gruppo esistente).members mygroup


Qualche spiegazione per coloro che sono interessati:

Esistono cinque modi diversi (di cui sono a conoscenza) che un utente può essere membro di un gruppo in OS X. Il comando non è garantito per l'output di tutti, o anche di uno qualsiasi dei membri di mygroup , perché l'appartenenza proviene anche dagli utenti " ID gruppo principale , appartenenza tramite UUID dell'utente , eredità di appartenenza da un gruppo a un altro e appartenenze calcolate dal sistema, ad esempio il gruppo tutti .dscl . -read /Groups/mygroup GroupMembership

Quindi, piuttosto che cercare di tenere traccia di tutti questi, sembra un'idea migliore semplicemente controllare l'appartenenza di ogni utente al sistema (usando dsmemberutil ), ed è quello che fanno la funzione shell e lo script qui sotto.


Questo script di membri equivale alla funzione shell, ma ha una gestione migliore dell'input non valido:

#!/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

Informazioni supplementari:

I cinque modi per essere un membro del gruppo sono:

  1. ID gruppo primario dell'utente
  2. Elencato nel GroupMembership del gruppo
  3. UUID elencato nei GroupMembers del gruppo
  4. Appartenenza ereditata al gruppo X in quanto membro del gruppo Y elencato nei gruppi nidificati del gruppo X.
  5. Iscrizione calcolata dal sistema

Questi possono essere esplorati con comandi simili dscl . -read /Groups/somegroup

Esempio 4 : L'appartenenza al gruppo Operatore di stampa __lpoperator_ è ereditata dai membri del gruppo Amministratore di stampa __lpadmin_ e l'appartenenza a quel gruppo è ereditata dai membri del gruppo admin .

Esempio di 5 :

$ dscl . -read /Groups/netaccounts Comment
Comment:
 Group membership calculated by system
 Accounts from a remote directory server
$ 

VEDERE ANCHE
    id (1) , dscl (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , uuid (3)


7
Questo è il tipo di peculiarità che ho in mente quando dico alla gente che mentre OS X è per lo più bello in superficie ha alcune cose brutte nascoste sotto le copertine.
— Stefan Schmidt,

+1 : funziona perfettamente. Merci.
— Slipp D. Thompson,

Queste sono le informazioni di cui avevo bisogno per capire come rimuovere me stesso dal gruppo di amministratori. Risulta che la rimozione tramite nome utente non è sufficiente, è inoltre necessario rimuovere l'UUID, consultare github.com/drduh/macOS-Security-and-Privacy-Guide/issues/…
— Jens Timmerman,

10

Nota: questa è stata la mia risposta iniziale, scritta prima che mi rendessi conto che questa risposta dà ancora un risultato incompleto . (Per esempio, non trova nessun membro del ognuno gruppo!) Così ho scritto una risposta migliore, che include uno script che elenca tutti i membri di un gruppo in OS X .


La proprietà GroupMembership di mygroup può essere stampata con dscl in questo modo:

dscl . -read /Groups/mygroup GroupMembership

Ma questo non è garantito per produrre tutti (o anche qualsiasi) i membri del gruppo. Ciò che manca sono gli utenti che sono membri del gruppo solo avendo come ID gruppo principale .

Un esempio comune di ciò in OS X sono gli account di accesso regolari, che hanno il personale (gruppo 20) come gruppo principale, ma non sono elencati nella proprietà GroupMembership del gruppo personale .

Questi utenti possono essere trovati cercando l' ID numerico del gruppo primario (gid) come in questo esempio per il gruppo staff (gid 20):

dscl . -list /Users PrimaryGroupID | grep " 20$"

e il gid numerico (PrimaryGroupID) di mygroup viene trovato da:

dscl . -read /Groups/mygroup PrimaryGroupID

7

Per ottenere tutti i gruppi in cui si trova un utente , è possibile utilizzare quanto segue:

id -nG <username>

Esempio di output:

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

Utilizzando il comando sopra, è possibile ottenere tutti gli utenti che appartengono a un gruppo :

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

Questo è un buon consiglio per ottenere un elenco di gruppi a cui appartiene un utente. Ma è l'opposto di ciò che l'OP stava chiedendo, che è l'elenco degli utenti che appartengono a un gruppo.
— Wisbucky,

@wisbucky questo è esattamente quello che stavo cercando. Sono arrivato qui alla ricerca di "elenca tutti i gruppi di un utente". Suggerirò una modifica per chiarire questo
— Isaac,

4

dscl . -read /Groups/[groupname] | grep GroupMembership

ATTENZIONE: il comando sopra non mostra sempre un elenco completo di TUTTI i membri del gruppo. Ad esempio per il "personale" del gruppo si ottiene "radice" solo come membro del gruppo che è incompleto. Per verificarlo, utilizzare uno dei seguenti comandi come utente predefinito (NON "root"): id -GnORgroups

Di conseguenza, vedrai tutti i gruppi a cui appartiene l'utente registrato predefinito. Uno di questi dovrebbe essere "personale". Pertanto, oltre a "root" ci sono più membri del gruppo "staff", che non sono elencati dal comando dscl . -read /Groups/[groupname] | grep GroupMembership. Lo stesso vale per il comando dscacheutil -q group -a name staffche suggerisce anche che solo "root" è un membro del gruppo "staff", che è ovviamente incompleto.

L'unico metodo affidabile per ottenere davvero TUTTI i membri di un gruppo nel terminale su OSX è già fornito qui da Arne Stenström. Questo sta usando la sua funzione shell resp. la sua sceneggiatura shell. Entrambi funzionano alla grande!


1

Comando

Simile alla risposta di @ duperuser, il seguente stamperà solo gli utenti del gruppo admincon spazi tra:

dscacheutil -q group -a name admin | grep -e '^users:' | sed 's/users: //'

Produzione

L'esecuzione del comando sopra produrrà qualcosa del genere:

root your_username someone_else

Abbattersi

Il dscacheutilcomando viene utilizzato per richiedere informazioni su varie categorie della cache del servizio di directory del sistema. L' -qopzione consente di specificare la categoria che si desidera interrogare. Le categorie disponibili sono group, host, mount, protocol, rpc, service e user. Eseguiamo inoltre una query su quella categoria specificando una coppia valore-chiave con l' -aopzione. In questo caso, vogliamo elencare il gruppo con la chiave nameuguale al valore admin. Il dscacheutilcomando sopra produce output in questo modo:

name: admin
password: *
gid: 80
users: root yourusername

Quindi reindirizziamo questo testo grepe scegliamo la riga contenente la stringa users:all'inizio. L' -eopzione consente a grep di riconoscere le espressioni regolari . Il ^personaggio specifica che vogliamo users:essere all'inizio della riga.

Questo ci dà

users: root yourusername

Infine, lo passiamo a sed e sostituiamo il testo users:con la stringa vuota. In sed , la prima lettera ssignifica sostituire. Il testo tra la prima coppia di barre ( /users: /) è ciò che vogliamo sostituire, e la coppia successiva di barre ( //) è ciò che vogliamo sostituire (in questo caso, nulla).


0

Ecco un'implementazione per questo problema che è stata derivata da un'implementazione in una discussione correlata . La routine è in qualche modo generica, con un hook di ricerca del servizio directory per qualsiasi piattaforma / architettura specifica, quindi può essere utilizzata senza modifiche su una rete eterogenea. Abbiamo installato un collegamento simbolico a questa utility denominata zed. Altre origini per questa implementazione sono menzionate nella sezione di attribuzione dello script. Questo strumento è progettato per essere eseguito su almeno OSX, HP-UX, Linux e SunOS, ma non è statotestato su SunOS e HP-UX. Lo script è stato testato il più possibile su Ubuntu Linux 12.04 e Mavericks OSX 10.9.1. L'output di questo script corrisponde all'output per la prima implementazione dello script shell per questo problema ed è quindi considerato corretto.

#!/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 (zed@debian.org or zed@resonant.org)
#
# 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";
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.