題 列出組的所有成員(Mac OS X)


我試過谷歌但沒有到達任何地方。如何列出所調用組的所有成員 mygroup 來自 命令行 在OS X?

$dscl . list /groups 會得到我所有的團體......但我怎麼能看到每個團體的成員?


49
2018-05-06 01:42


起源




答案:


您可以使用:

dscacheutil -q group -a name admin

要么:

dscacheutil -q group -a name staff

等等


35
2017-07-03 01:51



這是我最喜歡的方法。容易膩,準確。謝謝! - TryTryAgain
這是一個很好的答案,因為90%的使用案例可以用這個來解決,而不是使用更精細的腳本作為答案發布。 - JakeGould
只需將此作為別名添加到shell啟動文件中,您就可以將其作為單字命令加上組名稱。 - Neil Monroe
當我嘗試“dscacheutil -q group”時,我為組“admin”獲得了2個段落。兩者有相同的名稱,gid,但不同的用戶列表。任何的想法?謝謝! - Donald
不一定完整。 dscacheutil -q group -a name admin 只給了我1個結果,而Accepted Answer的shell腳本給了我2個結果。 - wisbucky


沒有標準命令列出OS X中組的所有成員,所以這是一個shell函數,它執行此操作:

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 我的組 (哪裡 我的組 是現有組的名稱)。


對有興趣的人有一些解釋:

 不同的方式(我知道)用戶可以成為OS X中組的成員。該命令 dscl . -read /Groups/我的組 GroupMembership 不保證輸出所有,甚至任何 我的組的成員,因為會員資格也來自用戶' 主要組ID,用戶的會員資格 UUID,成員從一個組到另一個組的繼承,以及由系統計算的成員資格,例如組 大家

因此,不要試圖跟踪所有這些,而是簡單地檢查系統上每個用戶的成員資格似乎是一個更好的主意(使用 dsmemberutil),這就是shell函數和下面的腳本所做的。


這個 會員 腳本相當於shell函數,但是對無效輸入的處理更好:

#!/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. 用戶的 PrimaryGroupID
  2. 在集團中列出 GroupMembership
  3. UUID 列在小組中 小組成員
  4. 通過成為組X中列出的組Y的成員來繼承組X的成員資格 NestedGroups
  5. 會員資格由系統計算

這些可以通過命令來探索 DSCL . -read /Groups/somegroup

例子 4:打印操作員組__lpoperator_的成員資格由打印管理員組__lpadmin_的成員繼承,該成員的成員資格由該成員繼承。 管理 組。

例子

$ 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)


59
2018-03-01 12:23



當我告訴人們雖然OS X表面上看起來很漂亮但它隱藏在封面下面時會有一些討厭的東西,這就是我想到的那種特殊性。 - Stefan Schmidt
+1:這很有效。留言Merci。 - Slipp D. Thompson
這是我需要弄清楚如何從管理員組中刪除自己的信息。原來不是用戶名刪除,你還需要刪除UUID,參見 github.com/drduh/macOS-Security-and-Privacy-Guide/issues/... - Jens Timmerman


注意:這是我最初的答案,在我意識到之前寫的 這個答案仍然給出了不完整的結果。 (例如,它找不到該成員 大家 小組!)所以我寫了 一個更好的答案,其中包括一個腳本,列出OS X中組的所有成員


我的組的GroupMembership屬性可以打印 DSCL 像這樣:

dscl . -read /Groups/mygroup GroupMembership

但是不能保證輸出該組成員的所有(甚至任何)成員。缺少的是作為該組成員的用戶,只有將其作為他們的成員 主要組ID

OS X中的一個常見示例是常規登錄帳戶,它具有 員工 (第20組)作為其主要組,但未列在GroupMembership屬性中 員工 組。

通過搜索數字可以找到這些用戶 主要組ID (gid)喜歡這個例子 員工 組(gid 20):

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

和。的數字gid(PrimaryGroupID) 我的組 發現者:

dscl . -read /Groups/mygroup PrimaryGroupID

9
2018-01-22 06:43





得到所有的 用戶所在的組,您可以使用以下內容:

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

6
2018-05-06 01:56



這是獲取用戶所屬組的列表的一個很好的提示。但它與OP所要求的相反,即屬於一個組的用戶列表。 - wisbucky
@wisbucky這正是我追求的。我到這裡尋找“列出用戶的所有組”。我會建議編輯來澄清這一點 - Isaac


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

注意:上面的命令並不總是顯示所有組成員的完整列表。例如。對於組“工作人員”,您只能獲得“root”作為不完整的組成員。要檢查它,請使用以下命令之一作為默認用戶(不是“root”): id -Gn 要么 groups

因此,您將看到默認登錄用戶所屬的所有組。其中一個應該是“工作人員”。因此,除了“root”之外,還有更多的“staff”組成員,這些成員未被命令列出 dscl . -read /Groups/[groupname] | grep GroupMembership。命令也是如此 dscacheutil -q group -a name staff 這也暗示你只有“根”是“工作人員”組的成員,這顯然是不完整的。

ArneStenström已經在這裡提供了唯一可靠的方法,可以在OSX終端上獲得所有組成員。這是使用他的shell函數resp。他的shell腳本。兩者都很棒!


4
2017-12-31 03:17





這是這個問題的實現 派生 來自一個實現 相關討論該例程有點通用,具有針對任何特定平台/體系結構的目錄服務查找鉤子,因此可以在異構網絡上使用它而無需修改。  我們已經為這個名為的實用程序安裝了一個符號鏈接 zed。腳本的歸屬部分中提到了此實現的其他來源。此工具至少應在OSX,HP-UX,Linux和SunOS上運行 沒有 在SunOS和HP-UX上測試過。該腳本盡可能在Ubuntu Linux 12.04和Mavericks OSX 10.9.1上進行了測試。此腳本的輸出與此問題的第一個shell腳本實現的輸出匹配,因此被認為是正確的。

#!/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";
    }
}

0
2018-01-31 05:24





命令

與@ 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識別 常用表達。該 ^ character指定我們想要的 users: 在線的開頭。

這給了我們

users: root yourusername

最後,我們將其傳遞給sed並替換文本 users: 用空字符串。在 SED,第一個字母 s 意味著替代。第一對斜線之間的文字(/users: /)是我們想要替換的,以及下一對斜線(//)是我們想要替代的東西(在這種情況下,沒有)。


0