我尝试过谷歌搜索,但一无所获。如何列出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
补充信息:
成为团体成员的五种方式是:
- 用户的主组ID
- 列入该集团的团体会员
- 唯一唯一标识符列入该集团的小组成员
- 通过成为 Y 组的成员(该组在 X 组的列表中),继承了 X 组的成员身份嵌套组
- 会员数量由系统计算
您可以使用以下命令进行探索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 -Gn
或groups
结果,您将看到您的默认登录用户所属的所有组。其中一个应该是“staff”。因此,除了“root”之外,还有更多“staff”组的成员,这些成员未通过命令列出dscl . -read /Groups/[groupname] | grep GroupMembership
。该命令也是如此dscacheutil -q group -a name staff
,它还建议您只有“root”是“staff”组的成员,这显然是不完整的。
Arne Stenström 已经提供了在 OSX 终端中获取群组所有成员的唯一可靠方法。这是使用他的 shell 函数或他的 shell 脚本。两种方法都很好用!