getent group <groupname>;
Linux と Solaris の両方で移植可能であり、ローカル グループ/パスワード ファイル、NIS、および LDAP 構成で動作します。
残念ながら、私が知っている、これを行うための移植性のある良い方法はありません。 /etc/group を解析しようとすると、他の人が示唆しているように、そのグループをプライマリ グループとして持つユーザーと、UNIX フラット ファイル (つまり、LDAP、NIS、 pam-pgsql など)。
どうしても自分でやらなければならない場合は、おそらく逆の手順で行うでしょう:use id
システム上のすべてのユーザーのグループを取得し (NSS に表示されるすべてのソースを取得します)、Perl などを使用して、発見された各グループのハッシュ テーブルを維持し、そのユーザーのメンバーシップを記録します。
編集:もちろん、これには同様の問題が残ります:システム上のすべてのユーザーのリストを取得する方法です。私の場所ではフラット ファイルと LDAP のみを使用しているため、両方の場所からリストを取得することができますが、それがあなたの環境に当てはまる場合とそうでない場合があります。
編集 2:通りすがりの誰かが getent passwd
を思い出させてくれました LDAP/NIS/などからのユーザーを含む、システム上のすべてのユーザーのリストを返しますが、ただし getent group
それでも、デフォルトのグループ エントリを介してのみメンバーであるユーザーを見逃すので、このクイック ハックを書くきっかけになりました.
#!/usr/bin/perl -T
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# 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";
my $wantedgroup = shift;
my %groupmembers;
my $usertext = `getent passwd`;
my @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
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";
}
}