Автор оригинала: Doug Hellmann.
Цель:
Чтение пользовательских данных из базы паролей Unix.
Модуль pwd
можно использовать для чтения информации о пользователе из базы данных паролей Unix (обычно /etc/passwd
). Интерфейс только для чтения возвращает объекты, похожие на кортежи, с именованными атрибутами для стандартных полей записи пароля.
Индекс
Атрибут
Смысл
pw_name
Логин пользователя
pw_passwd
Зашифрованный пароль (необязательно)
pw_uid
ID пользователя (целое число)
pw_gid
ID группы (целое число)
pw_gecos
Комментарий/ФИО
pw_dir
Домашний каталог
pw_shell
Приложение запускается при входе в систему, обычно это командный интерпретатор
Опрос всех пользователей
В этом примере печатается отчет обо всех «реальных» пользователях в системе, включая их домашние каталоги (где «реальные» определяются как имеющие имя, не начинающееся с « _
»). Чтобы загрузить всю базу паролей, используйте getpwall ()
. Возвращаемое значение – это список с неопределенным порядком, поэтому перед печатью отчета его необходимо отсортировать.
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('_')), keyoperator.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_lengthusername_length, uid_lengthuid_length, home_lengthhome_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_lengthusername_length, uid_lengthuid_length, home_lengthhome_length))
Большая часть приведенного выше примера кода прекрасно справляется с форматированием результатов. Цикл for
в конце показывает, как получить доступ к полям из записей по имени.
$ 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
Запрос пользователя по имени
Чтобы прочитать информацию об одном пользователе, необязательно читать всю базу паролей. Используйте getpwnam ()
, чтобы получить информацию о пользователе по имени.
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)
Пароли в системе, в которой был запущен этот пример, хранятся вне основной базы данных пользователей в теневом файле, поэтому поле пароля, если оно установлено, отображается как все *
.
$ 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
Запрос пользователя по UID
Также можно найти пользователя по его числовому идентификатору. Это полезно для поиска владельца файла:
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)
Числовой идентификатор пользователя также может использоваться для поиска информации о пользователе, выполняющем в данный момент процесс:
pwd_getpwuid_process.py
import pwd import os uid os.getuid() user_info pwd.getpwuid(uid) print('Currently running with>{}>{}'.format( uid, user_info.pw_name))
$ python3 pwd_getpwuid_process.py Currently running with
Смотрите также
- стандартная библиотека документации для pwd
spwd
– безопасный доступ к базе данных паролей для систем, использующих теневые пароли.- grp – Модуль grp считывает информацию о группе Unix.