답변:
당신이 사용할 수있는:
dscacheutil -q group -a name admin
또는:
dscacheutil -q group -a name staff
기타
dscacheutil -q group -a name admin
수락 된 답변의 셸 스크립트는 2 가지 결과를 제공하는 반면 나에게 1 개의 결과 만주었습니다.
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; };
위의 명령 줄을 터미널에 복사 한 다음 ( mygroup 은 기존 그룹의 이름)을 입력하십시오.members mygroup
관심있는 사람들을위한 설명 :
있습니다 다섯 가지 방법은 사용자가 OS X에서 그룹의 멤버 명령이 될 수 있음을 (내가 아는) 의, 심지어 어떤 모든 출력 보장되지 않거나 MyGroup을 회원은 또한 사용자로부터 오기 때문에,의 회원 ' 차 그룹 ID , 사용자에 의한 회원 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
보충 정보 :
그룹 회원이되는 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
$
SEE ALSO
ID (1) , 를, dscl (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , UUID (3)
참고 : 이것은 이 답변이 여전히 불완전한 결과를 제공 한다는 것을 깨닫기 전에 작성된 첫 번째 대답이었습니다 . (예를 들어, everyone 그룹의 구성원을 찾지 못했습니다 !) 따라서 OS X의 그룹 구성원을 모두 나열하는 스크립트를 포함하는 더 나은 답변을 작성 했습니다 .
mygroup 의 GroupMembership 속성은 다음과 같이 dscl 로 인쇄 할 수 있습니다 .
dscl . -read /Groups/mygroup GroupMembership
그러나 이것이 그룹 구성원의 전부 또는 일부를 출력한다고 보장하지는 않습니다. 누락 된 것은 기본 그룹 ID 로만 그룹의 구성원 인 사용자입니다 .
OS X에서 일반적인 예는 직원 (그룹 20)을 기본 그룹으로 사용하지만 직원 그룹 의 GroupMembership 속성에 나열되지 않은 일반 로그인 계정 입니다.
직원 그룹 (gid 20)에 대한 다음 예와 같이 숫자 기본 그룹 ID (gid) 를 검색하여 해당 사용자를 찾을 수 있습니다 .
dscl . -list /Users PrimaryGroupID | grep " 20$"
mygroup 의 숫자 gid (PrimaryGroupID)는 다음 과 같습니다.
dscl . -read /Groups/mygroup PrimaryGroupID
사용자가 속한 모든 그룹 을 얻으려면 다음을 사용할 수 있습니다.
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
유닉스 :
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
주의 : 위의 명령이 모든 그룹 구성원의 전체 목록을 항상 표시하지는 않습니다. 예를 들어 "staff"그룹의 경우 불완전한 그룹 구성원으로 "root"만 얻을 수 있습니다. 이를 확인하려면 다음 명령 중 하나를 기본 사용자로 사용하십시오 ( "root"아님). id -Gn
또는groups
결과적으로 기본 로그인 사용자가 속한 모든 그룹이 표시됩니다. 그들 중 하나는 "직원"이어야합니다. 따라서 "root"외에도 "staff"그룹의 구성원이 더 많으며이 명령은 명령으로 나열되지 않습니다 dscl . -read /Groups/[groupname] | grep GroupMembership
. dscacheutil -q group -a name staff
"root"만이 "staff"그룹의 멤버라는 것을 나타내는 명령 도 마찬가지 입니다. 이는 분명히 불완전합니다.
Arne Stenström은 OSX의 터미널에있는 그룹의 모든 구성원을 실제로 확보 할 수있는 신뢰할 수있는 유일한 방법입니다. 이것은 그의 쉘 함수 resp를 사용하고 있습니다. 그의 쉘 스크립트. 둘 다 잘 작동합니다!
명령
@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
옵션은 grep이 정규 표현식을 인식하게 합니다 . ^
캐릭터는 우리가 원하는 것을 지정 users:
줄의 시작 부분에있을 수 있습니다.
이것은 우리에게
users: root yourusername
마지막으로 이것을 sed에 전달하고 텍스트 users:
를 빈 문자열 로 바꿉니다 . 에서 나오지도 , 첫 글자를 s
대체하는 것을 의미합니다. 첫 번째 슬래시 쌍 ( /users: /
) 사이의 텍스트는 바꾸려는 것이고 다음 슬래시 쌍 ( //
)은 대체하려는 것입니다 (이 경우에는 아무것도 아님).
다음은 관련 토론 의 구현에서 파생 된 이 문제에 대한 구현입니다 . 이 루틴은 특정 플랫폼 / 아키텍처에 대한 디렉토리 서비스 조회 후크와 함께 다소 일반적이므로 이기종 네트워크에서 수정하지 않고 사용할 수 있습니다. 우리는이 유틸리티에 대한 심볼릭 링크를 설치했습니다 . 이 구현의 다른 출처는 스크립트의 속성 섹션에 언급되어 있습니다. 이 도구는 최소한 OSX, HP-UX, Linux 및 SunOS에서 실행되도록 설계 되었지만zed
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";
}
}