Список усіх членів групи (Mac OS X)


56

Я пробував Googling, але нікуди не дістався. Як я можу перерахувати всіх членів групи, викликаних mygroupз командного рядка в OS X?

$ dscl . list /groupsотримає мені всі групи ... але як я можу бачити членів кожної групи?

Відповіді:


40

Ви можете використовувати:

dscacheutil -q group -a name admin

або:

dscacheutil -q group -a name staff

тощо.


Це мій улюблений метод. Легкий горошок, і акуратний. Дякую!
TryTryAgain

Це чудова відповідь, оскільки 90% випадків використання можна вирішити саме цим, а не більш досконалими сценаріями, які були розміщені як відповіді.
JakeGould

Просто додайте це як псевдонім у файл запуску оболонки, і ви можете зробити з нього одну слово команду плюс назву групи.
Ніл Монро

Коли я спробував "dscacheutil -q group", я отримав 2 абзаци для групи "admin". Вони мають одне ім’я, gid, але різні користувачі списку. Будь-яка ідея? Дякую!
Золотий палець

Не обов'язково повно. dscacheutil -q group -a name adminдав мені лише 1 результат, тоді як сценарій оболонки прийнятого відповіді дав мені 2 результати.
wisbucky

64

Немає стандартної команди, яка перераховує всіх членів групи в OS X, тому ось функція оболонки, яка робить це:

members () { dscl . -list /Users | while read user; do printf "$user "; dsmemberutil checkmembership -U "$user" -G "$*"; done | grep "is a member" | cut -d " " -f 1; }; 

Скопіюйте вищевказаний командний рядок у термінал, а потім введіть (де моя група - це назва існуючої групи).members mygroup


Деякі пояснення для тих, хто цікавиться:

Існує п’ять різних способів (про які я знаю), що користувач може бути членом групи в ОС X. Команда не гарантована для виведення всіх або навіть будь-яких членів моєї групи, оскільки членство також походить від користувачів ' ідентифікатор первинної групи , членство в UUID користувача , успадкування членства від однієї групи до іншої та членство, яке обчислюється системою, наприклад, група для всіх .dscl . -read /Groups/mygroup GroupMembership

Тому замість того, щоб намагатися відслідковувати все це, здається, краща ідея просто перевірити приналежність кожного користувача до системи (використовуючи dsmemberutil ), і саме це робить функція оболонки та сценарій нижче.


Цей членський скрипт еквівалентний функції оболонки, але має кращу обробку з невірним введенням:

#!/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

Додаткова інформація:

П'ять способів бути членом групи:

  1. Основна група користувача
  2. Перераховано в групи GroupMembership
  3. UUID перераховані в групи GroupMembers
  4. Успадковане членство в групі X, будучи членом групи Y, яка занесена до групи NestedGroups групи X
  5. Членство, розраховане системою

Їх можна дослідити за допомогою таких команд dscl . -read /Groups/somegroup

Приклад 4 : Членство в групі Оператора друку __lpoperator_ успадковується членами групи адміністраторів друку __lpadmin_, а членство в цій групі успадковується членами групи адміністратора .

Приклад 5 :

$ dscl . -read /Groups/netaccounts Comment
Comment:
 Group membership calculated by system
 Accounts from a remote directory server
$ 

ВИДІТЬСЯ ТАКОЖ
    id (1) , dscl (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , uuid (3)


7
Це такі особливості, які я маю на увазі, коли я кажу людям, що в той час як OS X здебільшого гарна на поверхні, під кришками ховаються деякі неприємні речі.
Штефан Шмідт

+1 : Це працює добре. Мерсі.
Сліп Д. Томпсон

Це інформація, яка мені потрібна, щоб з'ясувати, як видалити себе з групи адміністратора. Виявляється, видалення по імені користувача не прийти, ви повинні видалити UUID см github.com/drduh/macOS-Security-and-Privacy-Guide/issues / ...
Jens Timmerman

10

Примітка. Це була моя початкова відповідь, написана до того, як я зрозумів, що ця відповідь все ще дає неповний результат . (Наприклад, він не знаходить членів кожної групи!) Так що я написав кращий відповідь, який включає в себе сценарій , який містить список всіх членів групи в OS X .


Властивість mygroup 's GroupMembership може бути надрукована таким чином, як dscl :

dscl . -read /Groups/mygroup GroupMembership

Але це не гарантовано виводить усіх (або навіть будь-яких) членів групи. Не вистачає користувачів, які входять до групи, лише якщо вона має свій основний ідентифікатор групи .

Поширений приклад цього в OS X - регулярні реєстраційні рахунки, які мають основну групу персоналу (група 20), але вони не вказані у власності GroupMembership групи персоналу .

Тих користувачів можна знайти, пошукаючи числовий ідентифікатор первинної групи (gid), як у цьому прикладі для групи персоналу (gid 20):

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

і числовий gid (PrimaryGroupID) моєї групи знаходить:

dscl . -read /Groups/mygroup PrimaryGroupID

7

Щоб отримати всі групи, в яких є користувач , ви можете скористатись такими:

id -nG <username>

Приклад Вихід:

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

Використовуючи команду, подану вище, можна отримати всіх користувачів, які належать до групи :

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

Це хороша порада отримати список груп, до яких належить користувач. Але це протилежне тому, що запитувала ОП, це список користувачів, які належать до групи.
wisbucky

@wisbucky це саме те, що я був після. Я потрапив сюди шукати "список усіх груп користувача". Я запропоную редагувати, щоб уточнити це
Ісаак

4

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

БУДЬ ЗАПАСНИЙ: Команда, наведена вище, не завжди відображає повний список ВСІХ членів групи. Наприклад, для персоналу групи "ви отримуєте" root "лише як член групи, який є неповним. Щоб перевірити це, використовуйте одну з наступних команд як користувача за замовчуванням (НЕ "root"): id -GnАБОgroups

У результаті ви побачите всі групи, учасником яких є користувач, зареєстрований за замовчуванням. Одним з них повинен бути «персонал». Таким чином, окрім "root" є більше членів групи "персонал", які не вказані командою dscl . -read /Groups/[groupname] | grep GroupMembership. Те саме стосується команди, dscacheutil -q group -a name staffяка також дозволяє вам припустити, що лише "корінь" є членом групи "персонал", яка, очевидно, неповна.

Єдиний надійний метод отримати дійсно ВСІ Члени групи в терміналі на OSX, тут уже наданий Арне Стенстрем. Для цього використовується його функція оболонки, відповідно. його сценарій оболонки. Обидва чудово працюють!


1

Командування

Подібно до відповіді @ duperuser, наступне буде друкувати лише користувачів групи adminз пробілами між ними:

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

Вихід

Виконання вищевказаної команди призведе до такого:

root your_username someone_else

Зламатися

dscacheutilКоманда використовується для запиту інформації про різних категоріях кеша служби каталогів системи. Цей -qпараметр дозволяє вказати категорію, яку ви хочете запитувати. Доступні категорії - це група, хост, програма монтажу, протокол, RPC, служба та користувач. Далі ми запитуємо цю категорію, вказавши пару ключових значень із -aпараметром. У цьому випадку ми хочемо перерахувати групу, яка має ключ, nameрівний значенню admin. dscacheutilВище команда виробляє висновок , як це:

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

Далі вводимо цей текст grepі вибираємо рядок, що містить рядок users:на початку. Цей -eпараметр змушує греп розпізнавати регулярні вирази . ^Символ вказує , що ми хочемо users:бути на початку рядка.

Це нам дає

users: root yourusername

Нарешті, ми передаємо це в sed і заміняємо текст users:порожнім рядком. У sed , перша літера sозначає замінити. Текст між першою паровою косою рисою ( /users: /) - це те, що ми хочемо замінити, і наступною парою косою косою рисою ( //) є те, що ми хочемо замінити (в даному випадку нічого).


0

Ось реалізація цієї проблеми, яка була отримана з реалізації у відповідній дискусії . Підпрограма є дещо загальною, з гаком пошуку служб каталогів для будь-якої конкретної платформи / архітектури, тому її можна використовувати без змін у гетерогенній мережі. Ми встановили символічне посилання на цю утиліту з назвою zed. Інші джерела цієї реалізації згадуються в розділі атрибуції сценарію. Цей інструмент призначений для роботи принаймні з OSX, HP-UX, linux та SunOS, але ще не бувперевірено на SunOS та HP-UX. Сценарій був протестований наскільки це можливо на Ubuntu Linux 12.04 та Mavericks OSX 10.9.1. Вихід цього сценарію відповідає результатам для першої реалізації сценарію оболонки для цієї проблеми, і тому вважається правильним.

#!/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";
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.