Liệt kê tất cả các thành viên của một nhóm (Mac OS X)


56

Tôi đã thử Googling nhưng không đi đến đâu. Làm cách nào tôi có thể liệt kê tất cả các thành viên của một nhóm được gọi mygrouptừ dòng lệnh trong OS X?

$ dscl . list /groupssẽ giúp tôi có tất cả các nhóm ... nhưng làm thế nào tôi có thể thấy các thành viên của mỗi nhóm?

Câu trả lời:


40

Bạn có thể dùng:

dscacheutil -q group -a name admin

hoặc là:

dscacheutil -q group -a name staff

Vân vân.


Đây là phương pháp yêu thích của tôi. Dễ dàng dễ dàng, và chính xác. Cảm ơn!
TryTryAgain 27/2/2015

Đây là một câu trả lời tuyệt vời vì 90% các trường hợp sử dụng có thể được giải quyết bằng cách này và không phải với các tập lệnh phức tạp hơn đã được đăng dưới dạng câu trả lời.
JakeGould

Chỉ cần thêm nó dưới dạng bí danh trong tệp khởi động shell của bạn và bạn có thể biến nó thành lệnh một từ cộng với tên nhóm.
Neil Monroe

Khi tôi thử "nhóm dscacheutil -q" tôi đã nhận được 2 đoạn cho nhóm "quản trị viên". Hai người có cùng tên, gid, nhưng danh sách người dùng khác nhau. Ý tưởng nào không? Cám ơn!
Ngón tay cái vàng

Không nhất thiết phải hoàn thành. dscacheutil -q group -a name adminchỉ cho tôi 1 kết quả, trong khi tập lệnh shell của Người trả lời được chấp nhận cho tôi 2 kết quả.
wvducky

64

Không có lệnh tiêu chuẩn liệt kê tất cả các thành viên của một nhóm trong OS X, vì vậy đây là một hàm shell thực hiện điều đó:

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

Sao chép dòng lệnh trên vào Terminal, sau đó nhập (trong đó mygroup là tên của một nhóm hiện có).members mygroup


Một số giải thích cho những người quan tâm:

lăm cách khác nhau (mà tôi biết) mà người dùng có thể là thành viên của một nhóm trong OS X. Lệnh không đảm bảo đầu ra tất cả, hoặc thậm chí bất kỳ, trong mygroup 's thành viên, vì thành viên cũng đến từ người dùng ' ID nhóm chính , thành viên của UUID của người dùng , kế thừa tư cách thành viên từ nhóm này sang nhóm khác và tư cách thành viên được hệ thống tính toán, chẳng hạn như mọi người trong nhóm .dscl . -read /Groups/mygroup GroupMembership

Vì vậy, thay vì cố gắng theo dõi tất cả những thứ đó, có vẻ như nên kiểm tra tư cách thành viên của mọi người dùng trên hệ thống (sử dụng dsmemberutil ), và đó là chức năng shell và tập lệnh bên dưới.


Tập lệnh thành viên này tương đương với hàm shell, nhưng xử lý đầu vào không hợp lệ tốt hơn:

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

Thông tin bổ sung:

Năm cách để trở thành thành viên của nhóm là:

  1. Của người dùng PrimaryGroupID
  2. Được liệt kê trong GroupMembership của nhóm
  3. UUID được liệt kê trong GroupMembers của nhóm
  4. Kế thừa thành viên của nhóm X bằng cách là thành viên của nhóm Y, được liệt kê trong Nhóm X của Nestedgroup
  5. Thành viên được tính bởi hệ thống

Chúng có thể được khám phá với các lệnh như dscl . -read /Groups/somegroup

Ví dụ về 4 : Tư cách thành viên của nhóm Toán tử in __lpoperator_ được kế thừa bởi các thành viên của nhóm Quản trị viên in __lpadmin_ và tư cách thành viên của nhóm đó được kế thừa bởi các thành viên của nhóm quản trị viên .

Ví dụ về 5 :

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

XEM THÊM
    id (1) , dscl (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttribution (7) , uuid (3)


7
Đây là loại đặc thù mà tôi có trong đầu khi nói với mọi người rằng trong khi OS X hầu hết đều đẹp trên bề mặt, nó có một số thứ khó chịu ẩn dưới vỏ bọc.
Stefan Schmidt

+1 : Điều này hoạt động vững chắc. Merci.
Slipp D. Thompson

Đây là thông tin tôi cần để tìm ra cách loại bỏ bản thân khỏi nhóm quản trị viên. Hóa ra việc xóa bằng tên người dùng là không đủ, bạn cũng cần xóa UUID, xem github.com/drduh/macOS-Security-and-Privacy-Guide/issues/iêu
Jens Timmerman

10

Lưu ý: Đây là câu trả lời ban đầu của tôi, được viết trước khi tôi nhận ra câu trả lời này vẫn cho kết quả không đầy đủ . (Ví dụ, nó tìm thấy không có thành viên của tất cả mọi người nhóm!) Vì vậy, tôi đã viết một câu trả lời tốt hơn, trong đó bao gồm một kịch bản mà liệt kê tất cả các thành viên của một nhóm trong OS X .


Thuộc tính GroupMembership của mygroup có thể được in bằng dscl như thế này:

dscl . -read /Groups/mygroup GroupMembership

Nhưng điều này không được đảm bảo để xuất ra tất cả (hoặc thậm chí bất kỳ) thành viên nào trong nhóm. Điều còn thiếu là những người dùng là thành viên của nhóm chỉ bằng cách lấy nó làm ID nhóm chính của họ .

Một ví dụ phổ biến về điều này trong OS X là các tài khoản đăng nhập thông thường, có nhân viên (nhóm 20) là nhóm chính của họ, nhưng không được liệt kê trong thuộc tính GroupMembership của nhóm nhân viên .

Những người dùng đó có thể được tìm thấy bằng cách tìm kiếm ID nhóm chính số (gid) như ví dụ này cho nhóm nhân viên (gid 20):

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

và gid số ( PrimarygroupID ) của mygroup được tìm thấy bởi:

dscl . -read /Groups/mygroup PrimaryGroupID

7

Để có được tất cả các nhóm mà người dùng tham gia , bạn có thể sử dụng như sau:

id -nG <username>

Kết quả ví dụ:

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

Sử dụng lệnh trên, có thể nhận được tất cả người dùng thuộc về một nhóm :

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

Đây là một mẹo hay để lấy danh sách các nhóm mà người dùng thuộc về. Nhưng nó trái ngược với những gì OP đã hỏi, đó là danh sách người dùng thuộc về một nhóm.
wvducky

@wvducky đây chính xác là những gì tôi đã theo đuổi. Tôi đến đây để tìm "danh sách tất cả các nhóm người dùng". Tôi sẽ đề nghị chỉnh sửa để làm rõ điều này
Isaac

4

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

ĐƯỢC TUYỆT VỜI: Lệnh trên không phải lúc nào cũng hiển thị danh sách đầy đủ TẤT CẢ các thành viên nhóm. Ví dụ, đối với nhóm "nhân viên", bạn chỉ nhận được "root" là thành viên nhóm không đầy đủ. Để kiểm tra, hãy sử dụng một trong các lệnh sau làm người dùng mặc định (KHÔNG "root"): id -GnHOẶCgroups

Kết quả là bạn sẽ thấy tất cả các nhóm người dùng đăng nhập mặc định của bạn là thành viên của. Một trong số họ phải là "nhân viên". Do đó, bên cạnh "root" còn có nhiều thành viên của nhóm "staff", không được liệt kê bởi lệnh dscl . -read /Groups/[groupname] | grep GroupMembership. Điều tương tự cũng xảy ra với lệnh dscacheutil -q group -a name staffcũng gợi ý cho bạn rằng chỉ "root" là thành viên của nhóm "staff", rõ ràng là không đầy đủ.

Phương pháp đáng tin cậy duy nhất để thực sự TẤT CẢ các thành viên của một nhóm trong thiết bị đầu cuối trên OSX đã được Arne Stenström cung cấp ở đây. Đây là sử dụng chức năng shell của mình. kịch bản vỏ của mình. Cả hai hoạt động tuyệt vời!


1

Chỉ huy

Tương tự như câu trả lời của @ duperuser, phần sau đây sẽ chỉ in ra những người dùng của nhóm admincó khoảng trắng ở giữa:

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

Đầu ra

Chạy lệnh trên sẽ tạo ra một cái gì đó như thế này:

root your_username someone_else

Phá vỡ

Các dscacheutillệnh được sử dụng để truy vấn thông tin về các loại khác nhau của bộ nhớ cache Directory Service của hệ thống. Các -qtùy chọn cho phép bạn chỉ định thư mục mà bạn muốn truy vấn. Các danh mục có sẵn là nhóm, máy chủ, gắn kết, giao thức, rpc, dịch vụ và người dùng. Chúng tôi tiếp tục truy vấn danh mục đó bằng cách chỉ định một cặp giá trị chính với -atùy chọn. Trong trường hợp này, chúng tôi muốn liệt kê nhóm có khóa namebằng giá trị admin. Các dscacheutillệnh trên tạo ra như thế này:

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

Tiếp theo, chúng tôi dẫn văn bản này vào grepvà chọn ra dòng chứa chuỗi users:ở đầu. Các -elàm cho tùy chọn grep nhận ra biểu thức thông thường . Nhân ^vật xác định rằng chúng tôi muốn users:ở đầu dòng.

Điều này cho chúng ta

users: root yourusername

Cuối cùng, chúng tôi chuyển cái này vào sed và thay thế văn bản users:bằng chuỗi rỗng. Trong sed , chữ cái đầu tiên scó nghĩa là để thay thế. Văn bản giữa cặp dấu gạch chéo đầu tiên ( /users: /) là thứ chúng ta muốn thay thế và cặp dấu gạch chéo tiếp theo ( //) là thứ chúng ta muốn thay thế (trong trường hợp này, không có gì).


0

Đây là một triển khai cho vấn đề này bắt nguồn từ việc thực hiện trong một cuộc thảo luận liên quan . Thường trình này hơi chung chung, với một móc tra cứu dịch vụ thư mục cho bất kỳ nền tảng / kiến ​​trúc cụ thể nào, do đó, nó có thể được sử dụng mà không cần sửa đổi trên một mạng không đồng nhất. Chúng tôi đã cài đặt một liên kết tượng trưng đến tiện ích này có tên zed. Nguồn gốc khác cho việc thực hiện này được đề cập trong phần phân bổ của tập lệnh. Công cụ này dự định được chạy trên ít nhất OSX, HP-UX, linux và SunOS, nhưng chưa đượcđã thử nghiệm trên SunOS và HP-UX. Kịch bản đã được thử nghiệm càng nhiều càng tốt trên Ubuntu Linux 12.04 và Mavericks OSX 10.9.1. Đầu ra của tập lệnh này khớp với đầu ra cho việc triển khai tập lệnh shell đầu tiên cho vấn đề này và do đó được coi là chính xác.

#!/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";
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.