pwd – Unix Password Database¶
Purpose: | Read user data from Unix password database. |
---|---|
Available In: | 1.4 and later |
The pwd module can be used to read user information from the Unix password database (usually /etc/passwd). The read-only interface returns tuple-like objects with named attributes for the standard fields of a password record.
Index | Attribute | Meaning |
---|---|---|
0 | pw_name | The user’s login name |
1 | pw_passwd | Encrypted password (optional) |
2 | pw_uid | User id (integer) |
3 | pw_gid | Group id (integer) |
4 | pw_gecos | Comment/full name |
5 | pw_dir | Home directory |
6 | pw_shell | Application started on login, usually a command interpreter |
Querying All Users¶
Suppose you need to print a report of all of the “real” users on a system, including their home directories (for our purposes, “real” is defined as having a name not starting with “_“). To load the entire password database, you would use getpwall(). The return value is a list with an undefined order, so you will need to sort it before printing the report.
import pwd
import operator
# Load all of the user data, sorted by username
all_user_data = pwd.getpwall()
interesting_users = sorted((u
for u in all_user_data
if not u.pw_name.startswith('_')),
key=operator.attrgetter('pw_name'))
# Find the longest lengths for a few fields
username_length = max(len(u.pw_name) for u in interesting_users) + 1
home_length = max(len(u.pw_dir) for u in interesting_users) + 1
# Print report headers
fmt = '%-*s %4s %-*s %s'
print fmt % (username_length, 'User',
'UID',
home_length, 'Home Dir',
'Description')
print '-' * username_length, '----', '-' * home_length, '-' * 30
# Print the data
for u in interesting_users:
print fmt % (username_length, u.pw_name,
u.pw_uid,
home_length, u.pw_dir,
u.pw_gecos)
Most of the example code above deals with formatting the results nicely. The for loop at the end shows how to access fields from the records by name.
$ python pwd_getpwall.py
User UID Home Dir Description
---------- ---- ------------------------ ------------------------------
daemon 1 /var/root System Services
daemon 1 /var/root System Services
dhellmann 527 /Users/dhellmann Doug Hellmann
nobody 4294967294 /var/empty Unprivileged User
nobody 4294967294 /var/empty Unprivileged User
postgres 528 /Library/PostgreSQL/9.0 PostgreSQL
root 0 /var/root System Administrator
root 0 /var/root System Administrator
Querying User By Name¶
If you need information about one user, it is not necessary to read the entire password database. Using getpwnam(), you can retrieve the information about a user by name.
import pwd
import sys
username = sys.argv[1]
user_info = pwd.getpwnam(username)
print 'Username:', user_info.pw_name
print 'Password:', user_info.pw_passwd
print 'Comment :', user_info.pw_gecos
print 'UID/GID :', user_info.pw_uid, '/', user_info.pw_gid
print 'Home :', user_info.pw_dir
print 'Shell :', user_info.pw_shell
The passwords on my system are stored outside of the main user database in a shadow file, so the password field, when set, is reported as all *.
$ python pwd_getpwnam.py dhellmann
Username: dhellmann
Password: ********
Comment : Doug Hellmann
UID/GID : 527 / 501
Home : /Users/dhellmann
Shell : /bin/bash
$ python pwd_getpwnam.py nobody
Username: nobody
Password: *
Comment : Unprivileged User
UID/GID : 4294967294 / 4294967294
Home : /var/empty
Shell : /usr/bin/false
Querying User By UID¶
It is also possible to look up a user by their numerical user id. This is useful to find the owner of a file:
import pwd
import os
import sys
filename = 'pwd_getpwuid_fileowner.py'
stat_info = os.stat(filename)
owner = pwd.getpwuid(stat_info.st_uid).pw_name
print '%s is owned by %s (%s)' % (filename, owner, stat_info.st_uid)
$ python pwd_getpwuid_fileowner.py
pwd_getpwuid_fileowner.py is owned by dhellmann (527)
The numeric user id is can also be used to find information about the user currently running a process:
import pwd
import os
uid = os.getuid()
user_info = pwd.getpwuid(uid)
print 'Currently running with UID=%s username=%s' % (uid, user_info.pw_name)
$ python pwd_getpwuid_process.py
Currently running with UID=527 username=dhellmann