私はグーグルを試したがどこにも行かなかった。 OS Xでコマンドラインからmygroup
というグループのすべてのメンバーを一覧表示する方法を教えてください。
$ dscl . list /groups
は私にすべてのグループを取得します...しかし、どのように私は各グループのメンバーを見ることができますか?
あなたが使用することができます:
dscacheutil -q group -a name admin
または
dscacheutil -q group -a name staff
等.
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
と入力します(mygroupは既存のグループの名前です)。
興味のある人のためのいくつかの説明:
ユーザーがOS Xのグループのメンバーになることができるという(=知っている)fiveの方法があります。コマンドdscl . -read /Groups/mygroup GroupMembership
がすべてを出力することは保証されていません。メンバーシップは、ユーザーのプライマリグループID、ユーザーによるメンバーシップからも得られるため、mygroupのメンバーでさえも、 _ 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
補足情報:
グループメンバーになるための5つの方法は次のとおりです。
これらはdscl . -read /Groups/somegroup
のようなコマンドで調べることができます
4の例:Print Operatorグループ__lpoperator_のメンバーシップは、Print Administratorグループ__lpadmin_のメンバーによって継承され、そのメンバーシップgroupはadminグループのメンバーによって継承されます。
5の例
$ 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)
注:これは私が最初に答えた、私が気付く前に書かれたこの答えはまだ不完全な結果を与える。 (たとえば、everyoneグループのメンバーは見つかりません。)だから私は より良い答えを書きました。 OS Xのグループ
mygroupのGroupMembershipプロパティは、 dscl のように印刷できます。
dscl . -read /Groups/mygroup GroupMembership
しかし、これはグループのメンバー全員(あるいは全員)のアウトプットを保証するものではありません。欠けているのは、グループをプライマリグループIDとして持つことによってのみグループのメンバーになっているユーザーです。
OS Xでの一般的な例は、通常のログインアカウントです。これは、スタッフ(グループ20)を主グループとして持っていますが、のGroupMembershipプロパティにはリストされていません。 staffグループ.
これらのユーザーは、staffグループ(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
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
dscl . -read /Groups/[groupname] | grep GroupMembership
注意:上記のコマンドは、必ずしもすべてのグループメンバーの完全なリストを表示するわけではありません。例えば。 "staff"というグループでは、不完全なグループメンバーとして "root"しか得られません。確認するには、デフォルトのユーザーとして次のいずれかのコマンドを使用します( "root"ではありません)。id -Gn
OR groups
その結果、あなたはあなたのデフォルトのログインユーザーがメンバーであるすべてのグループを見るでしょう。そのうちの1人は「スタッフ」であるべきです。したがって、 "root"以外に "staff"グループのメンバーがさらにあり、それらはコマンドdscl . -read /Groups/[groupname] | grep GroupMembership
によってリストされていません。同じことがコマンドdscacheutil -q group -a name staff
にも当てはまります。これは、 "root"だけが "staff"グループのメンバーであることを示唆していますが、これは明らかに不完全です。
OSX上の端末でグループのすべてのメンバーを実際に取得するための唯一の信頼できる方法は、すでにArneStenströmによって提供されています。これは彼のShell関数を使っています。彼のシェルスクリプト両方ともうまく機能します。
コマンド
@ 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
に pipe して、先頭に文字列users:
を含む行を選びます。 -e
オプションはgrepに 正規表現 を認識させます。 ^
文字は、users:
を行頭に置くことを指定します。
これは私たちに与えます
users: root yourusername
最後に、これをsedに渡し、テキストusers:
を空の文字列に置き換えます。 sed では、最初の文字s
は置換することを意味します。スラッシュの最初のペア(/users: /
)の間のテキストは置き換えたいもので、次のスラッシュのペア(//
)は置き換えたいものです(この場合は何もありません)。
これは 関連の議論 の実装から派生されたこの問題の実装です。 このルーチンは多少一般的なもので、特定のプラットフォーム/アーキテクチャ用のディレクトリサービスルックアップフックがあるので、異種ネットワーク上で修正なしで使用できます。これへのシンボリックリンクをインストールしました。 zed
という名前のユーティリティ。この実装の他の起源は、スクリプトの帰属のセクションに記載されています。このツールは、少なくともOSX、HP-UX、Linux、およびSunOS上で実行することを目的としていますが、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 ([email protected] or [email protected])
#
# 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";
}
}