Bir grubun tüm üyelerini listele (Mac OS X)


56

Googling'i denedim ama hiçbir yere varamadım. Nasıl adında bir grubun tüm üyelerinin listeleyebilirsiniz mygroupgelen komut satırı OS X?

$ dscl . list /groupsbana tüm grupları kazandıracak ... ama her grubun üyelerini nasıl görebilirim?

Yanıtlar:


40

Kullanabilirsiniz:

dscacheutil -q group -a name admin

veya:

dscacheutil -q group -a name staff

vb.


Bu benim en sevdiğim yöntem. Kolay peasy ve doğru. Teşekkürler!
Try TryAgain

Kullanım davalarının% 90'ı cevap olarak gönderilen daha ayrıntılı betikler ile değil, bununla çözülebildiğinden bu harika bir cevaptır.
JakeGould

Bunu sadece kabuk başlangıç ​​dosyanıza bir takma ad olarak ekleyin ve tek kelimeli bir komut artı grup adını yapabilirsiniz.
Neil Monroe

"Dscacheutil -q group" ı denediğimde "admin" grubu için 2 paragraf aldım. İkisinin adı aynı, gid, ancak farklı kullanıcılar listesi. Herhangi bir fikir? Teşekkür!
Golden Thumb

Mutlaka tamamlanmadı. dscacheutil -q group -a name adminyalnızca bana 1 sonuç verirken, Kabul Edilen Yanıtlayıcı'nın kabuk komut dosyası bana 2 sonuç verdi.
Wisbucky

64

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:

  1. Kullanıcının PrimaryGroupID
  2. Grubun Grup Üyeliği listesinde yer aldı
  3. Grubun Grup Üyelerinde listelenen UUID
  4. X grubunun NestedGroups grubunda listelenen Y grubunun üyesi olarak kalıtsal X grubunun üyeliği
  5. Sistem tarafından hesaplanan üyelik

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)


7
Bu, insanlara OS X'in yüzeyde çoğunlukla güzel olmasına rağmen kapakların altına gizlenmiş bazı kötü şeylerin olduğunu söylediğimde aklıma gelen özelliklerden biri.
Stefan Schmidt

+1 : Bu sağlam çalışıyor. Mersi.
Slipp D. Thompson

Bu kendimi yönetici grubundan nasıl çıkaracağımı bulmak için gereken bilgi. Bkz ayrıca UUID'sini kaldırmak gerekir, kullanıcı adına göre çıkarmadan enought değilmiş github.com/drduh/macOS-Security-and-Privacy-Guide/issues/...
Jens Timmerman

10

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

7

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

Bu, bir kullanıcının ait olduğu grupların listesini almak için iyi bir ipucudur. Ancak OP'nin sorduğu şeyin tam tersi, bir gruba ait kullanıcıların listesi.
Wisbucky

@wisbucky bu tam olarak benim peşimde olan şey. Buraya "bir kullanıcının tüm gruplarını listele" diyorum. Bunu açıklamak için bir düzenleme önereceğim
Isaac

4

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 -GnVEYAgroups

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!


1

komuta

@ Duperuser kullanıcısının cevabına benzer şekilde, aşağıdakiler yalnızca adminaraları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

dscacheutilKomut sistemin Directory Hizmet önbellek çeşitli kategorilerde hakkındaki bilgileri sorgulamak için kullanılır. -qSeç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, -aseçenekle birlikte bir anahtar değer çifti belirleyerek de sorgularız . Bu durumda, anahtarın namedeğerine eşit olan grubu listelemek istiyoruz admin. Yukarıdaki dscacheutilkomut bu şekilde çıktı üretir:

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

Sonra borusu bu işe metin grepve dizeyi içeren satırı seçmemde users:başında. -eSeç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 syerine 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).


0

İş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ırzedSunOS 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";
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.