Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Unfortunately, there is no good, portable way to do this that I know of. If you attempt to parse /etc/group, as others are suggesting, you will miss users who have that group as their primary group and anyone who has been added to that group via a mechanism other than UNIX flat files (i.e. LDAP, NIS, pam-pgsql, etc.).
- If I absolutely had to do this myself, I'd probably do it in reverse: use id to get the groups of every user on the system (which will pull all sources visible to NSS), and use Perl or something similar to maintain a hash table for each group discovered noting the membership of that user.
- Edit: Of course, this leaves you with a similar problem: how to get a list of every user on the system. Since my location uses only flat files and LDAP, I can just get a list from both locations, but that may or may not be true for your environment.
- Edit 2: Someone in passing reminded me that getent passwd will return a list of all users on the system including ones from LDAP/NIS/etc., but getent group still will still miss users that are members only via the default group entry, so that inspired me to write this quick hack.
- #!/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 (zed@debian.org or zed@resonant.org)
- #
- # 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";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement