Câu trả lời:
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.
dscacheutil -q group -a name admin
chỉ 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ả.
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:
Có 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à:
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)
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
Để 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
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 -Gn
HOẶ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 staff
cũ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!
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 admin
có 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 dscacheutil
lệ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 -q
tù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 -a
tùy chọn. Trong trường hợp này, chúng tôi muốn liệt kê nhóm có khóa name
bằng giá trị admin
. Các dscacheutil
lệ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 grep
và chọn ra dòng chứa chuỗi users:
ở đầu. Các -e
là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 s
có 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ì).
Đâ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";
}
}