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


56

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

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

Respostas:


40

Você pode usar:

dscacheutil -q group -a name admin

ou:

dscacheutil -q group -a name staff

etc.


Este é o meu método favorito. Fácil, fácil e preciso. Obrigado!
TryTryAgain 27/02

Essa é uma ótima resposta, pois 90% dos casos de uso podem ser resolvidos com isso e não com os scripts mais elaborados que foram postados como respostas.
JakeGould

Apenas adicione isso como um alias no arquivo de inicialização do shell e você poderá transformá-lo em um comando de uma palavra mais o nome do grupo.
Neil Monroe

Quando tentei "dscacheutil -q group", obtive 2 parágrafos para o grupo "admin". Os dois têm o mesmo nome, gid, mas lista de usuários diferentes. Qualquer ideia? Valeu!
Golden Thumb

Não necessariamente completo. dscacheutil -q group -a name adminsó me deu 1 resultado, enquanto o script de shell do respondente aceito me deu 2 resultados.
7266166Bom

64

Não há comando padrão que lista todos os membros de um grupo no OS X, então aqui está uma função 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 (onde mygroup é o nome de um grupo existente).members mygroup


Alguma explicação para quem está interessado:

Existem cinco maneiras diferentes (que eu conheço) de que um usuário possa ser membro de um grupo no OS X. Não é garantido que o comando produza todos ou todos os membros do mygroup , porque a associação também vem dos usuários ' ID do grupo primário , associação por UUID do usuário , herança de associação de um grupo para outro e associações calculadas pelo sistema, como o grupo todos .dscl . -read /Groups/mygroup GroupMembership

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


Esse script de membros é equivalente à função shell, mas possui um tratamento melhor da 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ções complementares:

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

  1. O PrimaryGroupID do usuário
  2. Listado em GroupMembership do grupo
  3. UUID listado no grupo GroupMembers
  4. Herança de associação do grupo X por ser membro do grupo Y, listado nos NestedGroups do grupo X
  5. Associação calculada pelo sistema

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

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

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)


7
Esse é o tipo de peculiaridade que tenho em mente quando digo às pessoas que, embora o OS X seja principalmente bonito na superfície, há algumas coisas desagradáveis ​​escondidas embaixo das cobertas.
Stefan Schmidt

+1 : Isso funciona solidamente. Merci.
Slipp D. Thompson

Esta é a informação que eu precisava para descobrir como me remover do grupo de administradores. Acontece que remover por nome de usuário não é suficiente, você também precisa remover o UUID, consulte github.com/drduh/macOS-Security-and-Privacy-Guide/issues/…
Jens Timmerman

10

Nota: Esta foi a minha resposta inicial, escrita antes que eu percebesse que esta resposta ainda fornece um resultado incompleto . (Por exemplo, ele não encontra os membros do todos grupo!) Então eu 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 mesmo de todos) membros do grupo. O que falta 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 as contas de login regulares, que têm a equipe (grupo 20) como seu grupo principal, mas não são listadas na propriedade GroupMembership do grupo de equipes .

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

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

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

dscl . -read /Groups/mygroup PrimaryGroupID

7

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

id -nG <username>

Saída de exemplo:

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

Esta é uma boa dica para obter a lista de grupos aos quais um usuário pertence. Mas é o oposto do que o OP estava perguntando, que é a lista de usuários que pertencem a um grupo.
7266166Bom

@wisbucky é exatamente isso que eu estava procurando. Cheguei aqui procurando "listar todos os grupos de um usuário". Vou sugerir uma edição para esclarecer isso
Isaac

4

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

ATENÇÃO: O comando acima nem sempre exibe uma lista completa de TODOS os membros do grupo. Por exemplo, para o grupo "equipe", você só obtém "raiz" como um membro do grupo incompleto. Para verificar, use um dos seguintes comandos como usuário padrão (NÃO "raiz"): id -GnOUgroups

Como resultado, você verá todos os grupos dos quais o usuário logado padrão é membro. Um deles deve ser "equipe". Assim, além de "root", há mais membros do grupo "staff", que não são listados pelo comando dscl . -read /Groups/[groupname] | grep GroupMembership. O mesmo vale para o comando dscacheutil -q group -a name staffque também sugere que apenas "root" é um membro do grupo "staff", o 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 resp. seu script shell. Ambos funcionam muito bem!


1

Comando

Semelhante à resposta do @ duperuser, o seguinte imprimirá apenas os usuários do grupo admincom espaços entre eles:

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

Resultado

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

root your_username someone_else

Demolir

O dscacheutilcomando é usado para consultar informações sobre várias categorias do cache do Serviço de Diretório do sistema. A -qopção 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-chave com a -aopção Nesse caso, queremos listar o grupo com a chave nameigual ao valor admin. O dscacheutilcomando acima produz resultados como este:

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

Em seguida, inserimos esse texto grepe selecionamos a linha que contém a string users:no início. A -eopção faz com que o grep reconheça expressões regulares . O ^caractere especifica que queremos users:estar 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. No sed , a primeira letra ssignifica 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).


0

Aqui está uma implementação para esse problema, derivada de uma implementação em uma discussão relacionada . A rotina é um tanto 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. Instalamos um link simbólico para esse utilitário chamado zed. Outras origens para esta implementação são mencionadas na seção de atribuição do script. Esta ferramenta deve ser executada em pelo menos OSX, HP-UX, linux e SunOS, mas não foitestado no SunOS e HP-UX. O script foi testado na medida do possível no Ubuntu Linux 12.04 e Mavericks OSX 10.9.1. A saída desse script corresponde à saída da primeira implementação de script de shell 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 (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";
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.