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.
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.
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:
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:
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
- Documentación de la biblioteca estándar para pwd
spwd
– Acceso seguro a la base de datos de contraseñas para sistemas que utilizan contraseñas ocultas.grp
– El módulogrp
lee la información del grupo Unix.