Yanıtlar:
Kullanabilirsiniz:
dscacheutil -q group -a name admin
veya:
dscacheutil -q group -a name staff
vb.
dscacheutil -q group -a name admin
yalnızca bana 1 sonuç verirken, Kabul Edilen Yanıtlayıcı'nın kabuk komut dosyası bana 2 sonuç verdi.
OS X'deki bir grubun tüm üyelerini listeleyen standart bir komut yoktur, bu yüzden şunu yapan bir kabuk işlevi vardır:
members () { dscl . -list /Users | while read user; do printf "$user "; dsmemberutil checkmembership -U "$user" -G "$*"; done | grep "is a member" | cut -d " " -f 1; };
Yukarıdaki komut satırını Terminal'e kopyalayın ve ardından ( grubumun var olan grubun adı olduğu yer) yazın.members mygroup
İlgilenenler için bazı açıklamalar:
Orada beş farklı yolu bir kullanıcı OS X'de bir grubun üyesi komut olabilir (Bildiğim kadarıyla) arasında, hatta herhangi tüm çıkış için garanti olmadığını veya mygroup üyelik ayrıca kullanıcılardan gelir, çünkü 'ın üyeleri ' birincil grup kimliği , kullanıcının UUID'sine üyelik, bir gruptan diğerine üyeliğin mirası ve sistem tarafından hesaplanan üyeler, herkes gibi .dscl . -read /Groups/mygroup GroupMembership
Tüm bunları takip etmeye çalışmak yerine, her kullanıcının sisteme üyeliğini ( dsmemberutil kullanarak ) kontrol etmek daha iyi bir fikir gibi görünüyor , ve kabuk işlevi ve aşağıdaki komut dosyası bunu yapıyor.
Bu üyeler betiği kabuk işlevine eşittir, ancak geçersiz girdilerin daha iyi ele alınmasına sahiptir:
#!/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
Ek bilgi:
Grup üyesi olmanın beş yolu:
Bunlar gibi komutlarla keşfedilebilir dscl . -read /Groups/somegroup
4 Örneği : Print Operator grubunun üyeliği __lpoperator_, Print Administrator grubunun __lpadmin_ üyeleri tarafından miras alınır ve bu grubun üyeliği admin grubunun üyeleri tarafından miras alınır .
5 örneği :
$ dscl . -read /Groups/netaccounts Comment
Comment:
Group membership calculated by system
Accounts from a remote directory server
$
BKZ
numarası (1) , DSCL (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , Uuid (3)
Not: Bu benim ilk cevabımdı, bu cevabın hala eksik bir sonuç verdiğini fark etmeden önce yazdım . (Örneğin, herkes grubunun hiçbir üyesini bulamaz !) Bu yüzden , bir grubun tüm üyelerini OS X'te listeleyen bir senaryo içeren daha iyi bir cevap yazdım .
mygroup sitesindeki GroupMembership özelliği ile basılabilir DSCL örneğin:
dscl . -read /Groups/mygroup GroupMembership
Ancak bu, grubun tüm üyelerinin (hatta hepsinin) çıkarılması garanti edilmez. Eksik olan, gruba üye olan kullanıcılar, yalnızca birincil grup kimlikleriyle sahip olmalarıdır .
OS X'te bunun yaygın bir örneği, birincil grup olarak personeli (grup 20) olan ancak personel grubunun GroupMembership özelliğinde listelenmeyen normal giriş hesaplarıdır .
Bu kullanıcılar , personel grubu için (gid 20) bu örnekte olduğu gibi sayısal birincil grup kimliği (gid) aranarak bulunabilir :
dscl . -list /Users PrimaryGroupID | grep " 20$"
ve sayısal GID (PrimaryGroupID) arasında mygroup ile bulunur:
dscl . -read /Groups/mygroup PrimaryGroupID
Bir kullanıcının içinde bulunduğu tüm grupları almak için aşağıdakileri kullanabilirsiniz:
id -nG <username>
Örnek çıktı:
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
Yukarıdaki komutu kullanarak, bir gruba ait olan tüm kullanıcıları elde etmek mümkündür :
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
DİKKAT: Yukarıdaki komut her zaman TÜM grup üyelerinin tam bir listesini göstermez. Örneğin, "personel" grubu için, tamamlanmamış bir grup üyesi olarak sadece "root" a sahip olursunuz. Kontrol etmek için varsayılan kullanıcı olarak aşağıdaki komutlardan birini kullanın ("root" değil): id -Gn
VEYAgroups
Sonuç olarak, varsayılan giriş yapmış olduğunuz kullanıcının üyesi olduğu tüm grupları göreceksiniz. Bunlardan biri "personel" olmalıdır. Bu nedenle, "root" un yanı sıra, "staff" grubunun komuta göre listelenmeyen üyeleri de var dscl . -read /Groups/[groupname] | grep GroupMembership
. Aynı şey dscacheutil -q group -a name staff
, size yalnızca "kökün" açıkça eksik olan "personel" grubunun bir üyesi olduğunu da söyleyen komut için de geçerlidir .
OSX üzerindeki terminaldeki bir grubun TÜM üyelerini gerçekten almak için tek güvenilir yöntem burada zaten Arne Stenström tarafından sağlandı. Bu onun kabuk fonksiyonunu kullanıyor. onun kabuk betiği. Her ikisi de harika çalışıyor!
komuta
@ Duperuser kullanıcısının cevabına benzer şekilde, aşağıdakiler yalnızca admin
aralarında boşluk olan grubun kullanıcılarını basacaktır :
dscacheutil -q group -a name admin | grep -e '^users:' | sed 's/users: //'
Çıktı
Yukarıdaki komutu çalıştırmak şöyle bir şey üretecektir:
root your_username someone_else
Yıkmak
dscacheutil
Komut sistemin Directory Hizmet önbellek çeşitli kategorilerde hakkındaki bilgileri sorgulamak için kullanılır. -q
Seçeneği sorgulamak istediğiniz kategoriyi belirlemenizi sağlar. Mevcut kategoriler grup, ana bilgisayar, mount, protokol, rpc, servis ve kullanıcıdır. Bu kategoriyi, -a
seçenekle birlikte bir anahtar değer çifti belirleyerek de sorgularız . Bu durumda, anahtarın name
değerine eşit olan grubu listelemek istiyoruz admin
. Yukarıdaki dscacheutil
komut bu şekilde çıktı üretir:
name: admin
password: *
gid: 80
users: root yourusername
Sonra borusu bu işe metin grep
ve dizeyi içeren satırı seçmemde users:
başında. -e
Seçenek grep tanımak yapar düzenli ifadeler . ^
Karakteri istediğimiz belirtir users:
satırın başında olması.
Bu bize verir
users: root yourusername
Sonunda, bunu sed'e aktarıyoruz ve metni users:
boş dize ile değiştiriyoruz . Gelen sed , ilk harfi s
yerine gelir. İlk eğik çizgi ( /users: /
) arasındaki metin , değiştirmek istediğimiz şeydir ve bir sonraki eğik çizgi ( //
), yerine koymak istediğimiz şeydir (bu durumda, hiçbir şey).
İşte bu problem için, ilgili bir tartışmadaki bir uygulamadan elde edilen bir uygulama . Rutin, herhangi bir platform / mimari için bir dizin hizmeti arama kancasına sahip bir şekilde geneldir, bu yüzden heterojen bir ağda değişiklik yapılmadan kullanılabilir. Adlı bu yardımcı programa sembolik bir bağlantı yükledik . Bu uygulama için diğer kökenler betiğin atıf bölümünde belirtilmiştir. Bu araç, en azından OSX, HP-UX, Linux ve SunOS çalıştırılmak üzere tasarlanmıştır, ancak olmamıştırzed
SunOS ve HP-UX'te test edilmiştir. Betik, Ubuntu Linux 12.04 ve Mavericks OSX 10.9.1'de mümkün olduğunca test edildi. Bu betiğin çıktısı, bu sorun için ilk kabuk betiği uygulamasının çıktısıyla eşleşir ve bu nedenle doğru kabul edilir.
#!/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";
}
}