getent group <groupname>;
Ini portabel di Linux dan Solaris, dan bekerja dengan file grup/kata sandi lokal, NIS, dan konfigurasi LDAP.
Sayangnya, tidak ada cara portabel yang bagus untuk melakukan ini yang saya ketahui. Jika Anda mencoba mengurai /etc/group, seperti yang disarankan orang lain, Anda akan kehilangan pengguna yang memiliki grup tersebut sebagai grup utama mereka dan siapa saja yang telah ditambahkan ke grup tersebut melalui mekanisme selain file datar UNIX (yaitu LDAP, NIS, pam-pgsql, dll.).
Jika saya benar-benar harus melakukannya sendiri, saya mungkin akan melakukannya secara terbalik:gunakan id
untuk mendapatkan grup dari setiap pengguna di sistem (yang akan menarik semua sumber yang terlihat oleh NSS), dan menggunakan Perl atau yang serupa untuk mempertahankan tabel hash untuk setiap grup yang ditemukan dengan mencatat keanggotaan pengguna tersebut.
Sunting:Tentu saja, ini membuat Anda memiliki masalah yang sama:cara mendapatkan daftar setiap pengguna di sistem. Karena lokasi saya hanya menggunakan file datar dan LDAP, saya hanya bisa mendapatkan daftar dari kedua lokasi, tetapi itu mungkin benar atau mungkin tidak untuk lingkungan Anda.
Sunting 2:Seseorang secara sepintas mengingatkan saya bahwa getent passwd
akan mengembalikan daftar semua pengguna di sistem termasuk yang dari LDAP/NIS/dll., tetapi getent group
masih akan merindukan pengguna yang menjadi anggota hanya melalui entri grup default, sehingga menginspirasi saya untuk menulis peretasan cepat ini.
#!/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";
}
}