Рубрики
Без рубрики

pwd – База паролей Unix

Автор оригинала: 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

Смотрите также