grp – Unix Group Database¶
| Purpose: | Read group data from Unix group database. | 
|---|---|
| Available In: | 1.4 and later | 
The grp module can be used to read information about Unix groups from the group database (usually /etc/group). The read-only interface returns tuple-like objects with named attributes for the standard fields of a group record.
| Index | Attribute | Meaning | 
|---|---|---|
| 0 | gr_name | Name | 
| 1 | gr_passwd | Password, if any (encrypted) | 
| 2 | gr_gid | Numerical id (integer) | 
| 3 | gr_mem | Names of group members | 
The name and password values are both strings, the GID is an integer, and the members are reported as a list of strings.
Querying All Groups¶
Suppose you need to print a report of all of the “real” groups on a system, including their members (for our purposes, “real” is defined as having a name not starting with “_”). To load the entire password database, you would use getgrall(). The return value is a list with an undefined order, so you probably want to sort it before printing the report.
import grp
import operator
# Load all of the user data, sorted by username
all_groups = grp.getgrall()
interesting_groups = sorted((g 
                            for g in all_groups 
                            if not g.gr_name.startswith('_')),
                            key=operator.attrgetter('gr_name'))
# Find the longest length for the name
name_length = max(len(g.gr_name) for g in interesting_groups) + 1
# Print report headers
fmt = '%-*s %4s %10s %s'
print fmt % (name_length, 'Name', 
             'GID', 
             'Password',
             'Members')
print '-' * name_length, '----', '-' * 10, '-' * 30
# Print the data
for g in interesting_groups:
    print fmt % (name_length, g.gr_name, 
                 g.gr_gid, 
                 g.gr_passwd,
                 ', '.join(g.gr_mem))
$ python grp_getgrall.py
Name                                      GID   Password Members
---------------------------------------- ---- ---------- ------------------------------
accessibility                              90          *
accessibility                              90          *
admin                                      80          * root, dhellmann
admin                                      80          * root
authedusers                                50          *
authedusers                                50          *
bin                                         7          *
bin                                         7          *
certusers                                  29          * root, _jabber, _postfix, _cyrus, _calendar, _dovecot
certusers                                  29          * root, _jabber, _postfix, _cyrus, _calendar, _dovecot
com.apple.access_screensharing            401            dhellmann
com.apple.access_screensharing-disabled   101            dhellmann
com.apple.access_ssh                      102            dhellmann
consoleusers                               53          *
consoleusers                               53          *
daemon                                      1          * root
daemon                                      1          * root
dhellmann                                 501
dialer                                     68          *
dialer                                     68          *
everyone                                   12          *
everyone                                   12          *
group                                      16          *
group                                      16          *
interactusers                              51          *
interactusers                              51          *
kmem                                        2          * root
kmem                                        2          * root
localaccounts                              61          *
localaccounts                              61          *
mail                                        6          * _teamsserver
mail                                        6          * _teamsserver
netaccounts                                62          *
netaccounts                                62          *
netusers                                   52          *
netusers                                   52          *
network                                    69          *
network                                    69          *
nobody                                   4294967294          *
nobody                                   4294967294          *
nogroup                                  4294967295          *
nogroup                                  4294967295          *
operator                                    5          * root
operator                                    5          * root
owner                                      10          *
owner                                      10          *
procmod                                     9          * root
procmod                                     9          * root
procview                                    8          * root
procview                                    8          * root
racemi                                    500            dhellmann
smmsp                                     103          *
staff                                      20          * root
staff                                      20          * root
sys                                         3          * root
sys                                         3          * root
tty                                         4          * root
tty                                         4          * root
utmp                                       45          *
utmp                                       45          *
wheel                                       0          * root
wheel                                       0          * root
Group Memberships for a User¶
Another common task might be to print a list of all the groups for a given user:
import grp
username = 'dhellmann'
groups = [g.gr_name for g in grp.getgrall() if username in g.gr_mem]
print username, 'belongs to:', ', '.join(groups)
$ python grp_groups_for_user.py
dhellmann belongs to: _lpadmin, admin, com.apple.access_screensharing-disabled, com.apple.access_screensharing, com.apple.access_ssh, racemi
Finding a Group By Name¶
As with pwd, it is also possible to query for information about a specific group, either by name or numeric id.
import grp
name = 'admin'
info = grp.getgrnam(name)
print 'Name    :', info.gr_name
print 'GID     :', info.gr_gid
print 'Password:', info.gr_passwd
print 'Members :', ', '.join(info.gr_mem)
$ python grp_getgrnam.py
Name    : admin
GID     : 80
Password: *
Members : root, dhellmann
Finding a Group by ID¶
To identify the group running the current process, combine getgrgid() with os.getgid().
import grp
import os
gid = os.getgid()
group_info = grp.getgrgid(gid)
print 'Currently running with GID=%s name=%s' % (gid, group_info.gr_name)
$ python grp_getgrgid_process.py
Currently running with GID=501 name=dhellmann
And to get the group name based on the permissions on a file, look up the group returned by os.stat().
import grp
import os
import sys
filename = 'grp_getgrgid_fileowner.py'
stat_info = os.stat(filename)
owner = grp.getgrgid(stat_info.st_gid).gr_name
print '%s is owned by %s (%s)' % (filename, owner, stat_info.st_gid)
$ python grp_getgrgid_fileowner.py
grp_getgrgid_fileowner.py is owned by dhellmann (501)

