Você pode usar:
dscacheutil -q group -a name admin
ou:
dscacheutil -q group -a name staff
etc.
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?
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:
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)
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 domygroup 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
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
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!
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).
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";
}
}