Listar todos os membros de um grupo (Mac OS X)

52

Eu tentei pesquisar no Google, mas não cheguei a lugar nenhum. Como posso listar todos os membros de um grupo chamado mygroup da linha de comando no OS X?

$ dscl . list /groups me dará todos os grupos ... mas como posso ver os membros de cada grupo?

    
por Meltemi 06.05.2011 / 03:42

7 respostas

38

Você pode usar:

dscacheutil -q group -a name admin

ou:

dscacheutil -q group -a name staff

etc.

    
por 03.07.2012 / 03:51
61

Não há um comando padrão que liste todos os membros de um grupo no OS X, então aqui está uma função de shell que faz isso:

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

Copie a linha de comando acima para o Terminal e digite members mygroup (onde mygroup é o nome de um grupo existente).

Algumas explicações para quem está interessado:

Existem cinco diferentes maneiras (que eu conheço) de que um usuário pode ser membro de um grupo no OS X. O comando dscl . -read /Groups/mygroup GroupMembership não tem garantia de produzir todos, ou até mesmo qualquer , dos membros do mygroup , porque a adesão também vem do ID do grupo principal dos usuários, a participação do usuário UUID , herança de associação de um grupo a outro e associações que são calculadas pelo sistema, como o grupo everyone .

Então, em vez de tentar acompanhar todos, parece uma idéia melhor simplesmente verificar a participação de todos os usuários no sistema (usando dsmemberutil ), e é isso que a função shell e o script abaixo fazem.

Este script membros é equivalente à função shell, mas tem melhor manipulação de entrada inválida:

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

Informação suplementar:

As cinco maneiras de ser um membro do grupo são:

  1. O do usuário
  2. Listados no GroupMembership do grupo
  3. UUID listado nos GroupMembers do grupo
  4. Associação herdada do grupo X por ser um membro do grupo Y, listado em NestedGroups do grupo X
  5. Afiliação calculada pelo sistema

Estes podem ser explorados com comandos como dscl . -read /Groups/somegroup

Exemplo de 4 : A associação do grupo Operador de Impressão __lpoperator_ é herdada pelos membros do grupo Administrador de Impressão __lpadmin_, e a associação desse grupo é herdada pelos membros do grupo o grupo admin .

Exemplo de 5 :

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

VEJA TAMBÉM
id (1) , dscl (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , uuid (3)

    
por 01.03.2012 / 13:23
9

Nota: Esta foi a minha resposta inicial, escrita antes de eu perceber esta resposta ainda dá um resultado incompleto . (Por exemplo, não encontra membros do grupo todos!) Então escrevi uma resposta melhor, que inclui um script que lista todos os membros de um grupo no OS X .

A propriedade GroupMembership do

mygroup pode ser impressa com dscl assim:

dscl . -read /Groups/mygroup GroupMembership

Mas isso não garante a saída de todos (ou até mesmo nenhum) dos membros do grupo. O que está faltando são os usuários que são membros do grupo apenas por tê-lo como seu ID de grupo principal .

Um exemplo comum disso no OS X são contas de login regulares, que têm equipe (grupo 20) como seu grupo primário, mas não estão listadas na propriedade GroupMembership da equipe grupo.

Esses usuários podem ser encontrados pesquisando o ID do grupo primário numérico (gid) como este exemplo para o grupo staff (gid 20):

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

e o gid numérico (PrimaryGroupID) de mygroup é encontrado por:

dscl . -read /Groups/mygroup PrimaryGroupID
    
por 20.03.2017 / 11:16
7

Para obter todos os grupos em que um usuário está , você pode usar o seguinte:

id -nG <username>

Exemplo de saída:

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

Utilizando o comando acima, é possível obter todos os usuários que pertencem a um grupo :

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
    
por 22.01.2016 / 07:43
4

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

BE AWARE: O comando acima nem sempre exibe uma lista completa de todos os membros do grupo. Por exemplo. para o grupo "staff" você só recebe "root" como um membro do grupo que está incompleto. Para verificar, use um dos seguintes comandos como um usuário padrão (NÃO "root"): id -Gn OR groups

Como resultado, você verá todos os grupos dos quais seu usuário logado padrão é membro. Um deles deve ser "staff". Assim, além de "root" existem mais membros do grupo "staff", que não estão listados pelo comando dscl . -read /Groups/[groupname] | grep GroupMembership . O mesmo vale para o comando dscacheutil -q group -a name staff , que também sugere que apenas "root" é um membro do grupo "staff", que é obviamente incompleto.

O único método confiável para obter realmente TODOS os membros de um grupo no terminal no OSX já é fornecido aqui por Arne Stenström. Isso está usando sua função shell. seu script de shell. Ambos funcionam muito bem!

    
por 06.05.2011 / 03:56
1

Comando

Semelhante à resposta do @ duperuser, o seguinte imprimirá apenas os usuários do grupo admin com espaços intermediários:

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

Saída

A execução do comando acima produzirá algo parecido com isto:

root your_username someone_else

Repartição

O comando dscacheutil é usado para consultar informações sobre várias categorias do cache do serviço de diretório do sistema. A opção -q permite especificar a categoria que você deseja consultar. As categorias disponíveis são grupo, host, montagem, protocolo, rpc, serviço e usuário. Além disso, consultamos essa categoria especificando um par de valores de chave com a opção -a . Nesse caso, queremos listar o grupo com a chave name igual ao valor admin . O comando dscacheutil acima produz uma saída assim:

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

Em seguida, canalize este texto para grep e escolha a linha que contém a string users: no começo. A opção -e faz com que o grep reconheça expressões regulares . O caractere ^ especifica que queremos que users: esteja no início da linha.

Isso nos dá

users: root yourusername

Finalmente, passamos isso para sed e substituímos o texto users: pela string vazia. Em sed , a primeira letra s significa substituir. O texto entre o primeiro par de barras ( /users: / ) é o que queremos substituir, e o próximo par de barras ( // ) é o que queremos substituir (neste caso, nada).

    
por 31.01.2015 / 06:24
0

Aqui está uma implementação para esse problema que foi derivado de uma implementação em . A rotina é um pouco genérica, com um gancho de pesquisa de serviço de diretório para qualquer plataforma / arquitetura específica, para que possa ser usada sem modificação em uma rede heterogênea. Nós instalamos um link simbólico para este utilitário chamado% código%. Outras origens para essa implementação são mencionadas na seção de atribuição do script. Esta ferramenta destina-se a ser executada em pelo menos OSX, HP-UX, Linux e SunOS, mas não foi testada em SunOS e HP-UX. O script foi testado o máximo possível no Ubuntu Linux 12.04 e no Mavericks OSX 10.9.1. A saída deste script corresponde à saída da primeira implementação do shell script para esse problema e, portanto, é considerada correta.

#!/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";
    }
}
    
por 31.12.2013 / 04:17