그룹의 모든 구성원 나열 (Mac OS X)


56

인터넷 검색을 시도했지만 아무데도 가지 않습니다. OS X mygroup명령 줄 에서 호출 된 그룹의 모든 구성원을 나열하려면 어떻게 해야합니까?

$ dscl . list /groups는 모든 그룹을 가져올 것입니다 ...하지만 각 그룹의 멤버를 어떻게 볼 수 있습니까?

답변:


40

당신이 사용할 수있는:

dscacheutil -q group -a name admin

또는:

dscacheutil -q group -a name staff

기타


이것은 내가 가장 좋아하는 방법입니다. 쉬우면서도 정확합니다. 감사!
TryTryAgain

사용 사례의 90 %가 답변으로 게시 된보다 정교한 스크립트가 아니라이를 사용하여 해결할 수 있기 때문에 이는 훌륭한 답변입니다.
JakeGould

이것을 쉘 시작 파일에 별명으로 추가하면 한 단어로 된 명령에 그룹 이름을 추가 할 수 있습니다.
Neil Monroe

"dscacheutil -q group"을 시도했을 때 "admin"그룹에 대해 2 개의 단락이 있습니다. 두 사람의 이름은 동일하지만 사용자 목록은 다릅니다. 어떤 생각? 고마워!
Golden Thumb

반드시 완전한 것은 아닙니다. dscacheutil -q group -a name admin수락 된 답변의 셸 스크립트는 2 가지 결과를 제공하는 반면 나에게 1 개의 결과 만주었습니다.
wisbucky 2016

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; }; 

위의 명령 줄을 터미널에 복사 한 다음 ( 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 가지 방법은 다음과 같습니다.

  1. 사용자의 PrimaryGroupID
  2. 그룹의 GroupMembership에 상장
  3. 그룹의 GroupMembers에 나열된 UUID
  4. 그룹 X의 NestedGroups에 나열된 그룹 Y의 구성원이되어 그룹 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
$ 

SEE ALSO
    ID (1) , 를, dscl (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , UUID (3)


7
이것은 사람들에게 OS X가 표면에서 대부분 아름답지만 표지 아래에 숨겨진 물건이 있다는 것을 사람들에게 말할 때 유념해야 할 종류입니다.
Stefan Schmidt

+1 : 제대로 작동합니다. 자비.
Slipp D. Thompson

이것은 관리자 그룹에서 자신을 제거하는 방법을 알아내는 데 필요한 정보입니다. 사용자 이름으로 제거하는 것만으로는 충분하지 않습니다. UUID도 제거해야합니다. github.com/drduh/macOS-Security-and-Privacy-Guide/issues/…를
Jens Timmerman

10

참고 : 이것은 이 답변이 여전히 불완전한 결과를 제공 한다는 것을 깨닫기 전에 작성된 첫 번째 대답이었습니다 . (예를 들어, 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

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

유닉스 :

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

이것은 사용자가 속한 그룹 목록을 얻는 좋은 팁입니다. 그러나 OP가 요청한 것과 반대입니다. 이는 그룹에 속한 사용자 목록입니다.
wisbucky 2016

@ wisbucky 이것은 정확히 내가 추구 한 것입니다. "사용자의 모든 그룹을 나열하십시오"를 찾고 있습니다. 나는 이것을 명확히하기 위해 편집을 제안 할 것이다
Isaac Isaac

4

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를 사용하고 있습니다. 그의 쉘 스크립트. 둘 다 잘 작동합니다!


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옵션은 grep이 정규 표현식을 인식하게 합니다 . ^캐릭터는 우리가 원하는 것을 지정 users:줄의 시작 부분에있을 수 있습니다.

이것은 우리에게

users: root yourusername

마지막으로 이것을 sed에 전달하고 텍스트 users:를 빈 문자열 로 바꿉니다 . 에서 나오지도 , 첫 글자를 s대체하는 것을 의미합니다. 첫 번째 슬래시 쌍 ( /users: /) 사이의 텍스트는 바꾸려는 것이고 다음 슬래시 쌍 ( //)은 대체하려는 것입니다 (이 경우에는 아무것도 아님).


0

다음은 관련 토론 의 구현에서 파생 된 이 문제에 대한 구현입니다 . 이 루틴은 특정 플랫폼 / 아키텍처에 대한 디렉토리 서비스 조회 후크와 함께 다소 일반적이므로 이기종 네트워크에서 수정하지 않고 사용할 수 있습니다. 우리는이 유틸리티에 대한 심볼릭 링크를 설치했습니다 . 이 구현의 다른 출처는 스크립트의 속성 섹션에 언급되어 있습니다. 이 도구는 최소한 OSX, HP-UX, Linux 및 SunOS에서 실행되도록 설계 되었지만zedSunOS 및 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";
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.