pwd — Base de datos de contraseñas de Unix

Propósito:Leer los datos del usuario de la base de datos de contraseñas de Unix.

El módulo pwd se puede usar para leer la información del usuario de la base de datos de contraseñas de Unix (generalmente /etc/passwd). La interfaz de solo lectura devuelve objetos tipo tupla con atributos con nombre para los campos estándar de un registro de contraseña.

Índice Atributo Significado
0 pw_name El nombre de inicio de sesión del usuario
1 pw_passwd Contraseña encriptada (opcional)
2 pw_uid ID de usuario (número entero)
3 pw_gid ID de grupo (número entero)
4 pw_gecos Comentario / nombre completo
5 pw_dir Directorio de inicio
6 pw_shell La aplicación inicia al iniciar sesión, generalmente un intérprete de comandos

Consultando todos los usuarios

Este ejemplo imprime un informe de todos los usuarios «reales» en un sistema, incluidos sus directorios de inicio (donde «real» se define como un nombre que no comienza con «_»). Para cargar la base de datos de contraseñas completa, usa getpwall(). El valor de retorno es una lista con un orden indefinido, por lo que debe ordenarse antes de imprimir el informe.

pwd_getpwall.py
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
uid_length = max(len(str(u.pw_uid))
                 for u in interesting_users) + 1

# Print report headers
fmt = ' '.join(['{:<{username_length}}',
                '{:>{uid_length}}',
                '{:<{home_length}}',
                '{}'])
print(fmt.format('User',
                 'UID',
                 'Home Dir',
                 'Description',
                 username_length=username_length,
                 uid_length=uid_length,
                 home_length=home_length))
print('-' * username_length,
      '-' * uid_length,
      '-' * home_length,
      '-' * 20)

# Print the data
for u in interesting_users:
    print(fmt.format(u.pw_name,
                     u.pw_uid,
                     u.pw_dir,
                     u.pw_gecos,
                     username_length=username_length,
                     uid_length=uid_length,
                     home_length=home_length))

La mayoría del código de ejemplo anterior trata de formatear bien los resultados. El bucle for al final muestra cómo acceder a los campos de los registros por nombre.

$ python3 pwd_getpwall.py

User               UID Home Dir          Description
---------- ----------- ----------------- --------------------
Guest              201 /Users/Guest      Guest User
daemon               1 /var/root         System Services
daemon               1 /var/root         System Services
dhellmann          501 /Users/dhellmann  Doug Hellmann
nobody      4294967294 /var/empty        Unprivileged User
nobody      4294967294 /var/empty        Unprivileged User
root                 0 /var/root         System Administrator
root                 0 /var/root         System Administrator

Consultar usuario por nombre

Para leer información sobre un usuario no es necesario leer toda la base de datos de contraseñas. Usa getpwnam(), para recuperar la información sobre un usuario por su nombre.

pwd_getpwnam.py
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)

Las contraseñas en el sistema donde se ejecutó este ejemplo se almacenan fuera de la base de datos principal del usuario en un archivo oculto, por lo que el campo de contraseña, cuando se establece, se informa como *.

$ python3 pwd_getpwnam.py dhellmann

Username: dhellmann
Password: ********
Comment : Doug Hellmann
UID/GID : 501 / 20
Home    : /Users/dhellmann
Shell   : /bin/bash

$ python3 pwd_getpwnam.py nobody

Username: nobody
Password: *
Comment : Unprivileged User
UID/GID : 4294967294 / 4294967294
Home    : /var/empty
Shell   : /usr/bin/false

Consultar usuario por UID

También es posible buscar un usuario por su identificación de usuario. Esto es útil para encontrar el propietario de un archivo:

pwd_getpwuid_fileowner.py
import pwd
import os

filename = 'pwd_getpwuid_fileowner.py'
stat_info = os.stat(filename)
owner = pwd.getpwuid(stat_info.st_uid).pw_name

print('{} is owned by {} ({})'.format(
    filename, owner, stat_info.st_uid))
$ python3 pwd_getpwuid_fileowner.py

pwd_getpwuid_fileowner.py is owned by dhellmann (501)

El ID de usuario también se puede usar para buscar información sobre el usuario que actualmente ejecuta un proceso:

pwd_getpwuid_process.py
import pwd
import os

uid = os.getuid()
user_info = pwd.getpwuid(uid)
print('Currently running with UID={} username={}'.format(
    uid, user_info.pw_name))
$ python3 pwd_getpwuid_process.py

Currently running with UID=501 username=dhellmann

Ver también