Respostas:
Você pode usar:
dscacheutil -q group -a name admin
ou:
dscacheutil -q group -a name staff
etc.
dscacheutil -q group -a name admin
só me deu 1 resultado, enquanto o script de shell do respondente aceito me deu 2 resultados.
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:
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)
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
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
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 -Gn
OUgroups
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 staff
que 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!
Comando
Semelhante à resposta do @ duperuser, o seguinte imprimirá apenas os usuários do grupo admin
com 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 dscacheutil
comando é usado para consultar informações sobre várias categorias do cache do Serviço de Diretório do sistema. A -q
opçã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 -a
opção Nesse caso, queremos listar o grupo com a chave name
igual ao valor admin
. O dscacheutil
comando acima produz resultados como este:
name: admin
password: *
gid: 80
users: root yourusername
Em seguida, inserimos esse texto grep
e selecionamos a linha que contém a string users:
no início. A -e
opçã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 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).
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";
}
}