在 OS X 中从命令行列出组的所有成员

在 OS X 中从命令行列出组的所有成员

我尝试过谷歌搜索,但一无所获。如何列出mygroup从 OS X 中的命令行调用的组的所有成员?

dscl . list /groups

会让我获取所有群组。但我如何才能看到每个群组的成员?

答案1

您可以使用:

dscacheutil -q group -a name admin

或者:

dscacheutil -q group -a name staff

ETC。

答案2

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 mygroup(其中我的组是现有组的名称)。


给那些感兴趣的人一些解释:

据我所知,用户可以在 OS X 中成为组成员的不同方法。命令dscl . -read /Groups/mygroup GroupMembership不能保证输出所有甚至任何我的组的会员,因为会员资格也来自用户的主要组 ID,按用户唯一唯一标识符、从一个组到另一个组的成员资格继承以及由系统计算的成员资格,例如组每个人

因此,与其试图跟踪所有这些,不如简单地检查系统上每个用户的成员资格(使用dsmemberutil),这就是 shell 函数和下面的脚本所做的事情。


成员script 相当于 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. 用户的主组ID
  2. 列入该集团的团体会员
  3. 唯一唯一标识符列入该集团的小组成员
  4. 通过成为 Y 组的成员(该组在 X 组的列表中),继承了 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
$ 

也可以看看
    编号(1)dscl(1)dsmemberutil(1)dseditgroup(8)目录服务属性(7)uuid(3)

答案3

注:这是我最初的回答,在我意识到之前写的这个答案仍然给出不完整的结果. (例如,它找不到每个人组!)所以我写道一个更好的答案,其中包括一个列出 OS X 中某个组的所有成员的脚本


我的组的 GroupMembership 属性可以打印韓國像这样:

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

答案4

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

请注意:上述命令并不总是显示所有组成员的完整列表。例如,对于组“staff”,您只能获得“root”作为组成员,这是不完整的。要检查它,请以默认用户(不是“root”)身份使用以下命令之一:id -Gngroups

结果,您将看到您的默认登录用户所属的所有组。其中一个应该是“staff”。因此,除了“root”之外,还有更多“staff”组的成员,这些成员未通过命令列出dscl . -read /Groups/[groupname] | grep GroupMembership。该命令也是如此dscacheutil -q group -a name staff,它还建议您只有“root”是“staff”组的成员,这显然是不完整的。

Arne Stenström 已经提供了在 OSX 终端中获取群组所有成员的唯一可靠方法。这是使用他的 shell 函数或他的 shell 脚本。两种方法都很好用!

相关内容