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

grp – База данных Unix Group

Автор оригинала: Doug Hellmann.

Цель:

Чтение данных группы из базы данных группы Unix.

Модуль grp можно использовать для чтения информации о группах Unix из базы данных групп (обычно /etc/group ). Интерфейс только для чтения возвращает объекты, похожие на кортежи, с именованными атрибутами для стандартных полей групповой записи.

Показатель

Атрибут

Смысл

gr_name

имя

gr_passwd

Пароль, если есть (зашифрованный)

gr_gid

Числовой идентификатор (целое число)

gr_mem

Имена участников группы

Значения имени и пароля являются строками, GID – целым числом, а члены представлены в виде списка строк.

Запрос всех групп

В этом примере печатается отчет обо всех «реальных» группах в системе, включая их членов (где «реальные» определяются как имеющие имя, не начинающееся с « _ »). Чтобы загрузить всю базу паролей, используйте getgrall () .

grp_getgrall.py

import grp
import textwrap

# Load all of the user data, sorted by username
all_groups  grp.getgrall()
interesting_groups  {
    g.gr_name: g
    for g in all_groups
    if not g.gr_name.startswith('_')
}
print(len(interesting_groups.keys()))

# Find the longest length for a few fields
name_length  max(len(k) for k in interesting_groups) + 1
gid_length  max(len(str(u.gr_gid))
                 for u in interesting_groups.values()) + 1

# Set the members field width to avoid table columns
# wrapping
members_width  19

# Print report headers
fmt  ' '.join(['{:<{name_length}}',
                '{:{gid_length}}',
                '{:<{members_width}}',
                ])
print(fmt.format('Name',
                 'GID',
                 'Members',
                 name_lengthname_length,
                 gid_lengthgid_length,
                 members_widthmembers_width))
print('-' * name_length,
      '-' * gid_length,
      '-' * members_width)

# Print the data
prefix  ' ' * (name_length + gid_length + 2)
for name, g in sorted(interesting_groups.items()):
    # Format members to start in the column on the same line but
    # wrap as needed with an indent sufficient to put the
    # subsequent lines in the members column. The two indent
    # prefixes need to be the same to compute the wrap properly,
    # but the first should not be printed so strip it.
    members  textwrap.fill(
        ', '.join(g.gr_mem),
        initial_indentprefix,
        subsequent_indentprefix,
        widthmembers_width + len(prefix),
    ).strip()
    print(fmt.format(g.gr_name,
                     g.gr_gid,
                     members,
                     name_lengthname_length,
                     gid_lengthgid_length,
                     members_widthmembers_width))

Возвращаемое значение представляет собой список с неопределенным порядком, поэтому его необходимо отсортировать перед печатью отчета.

$ python3 grp_getgrall.py

34
Name                            GID         Members
------------------------------- ----------- -------------------
accessibility                            90
admin                                    80 root
authedusers                              50
bin                                       7
certusers                                29 root, _jabber,
                                            _postfix, _cyrus,
                                            _calendar, _dovecot
com.apple.access_disabled               396
com.apple.access_ftp                    395
com.apple.access_screensharing          398
com.apple.access_sessionkey             397
com.apple.access_ssh                    399
com.apple.sharepoint.group.1            701 dhellmann
consoleusers                             53
daemon                                    1 root
dialer                                   68
everyone                                 12
group                                    16
interactusers                            51
kmem                                      2 root
localaccounts                            61
mail                                      6 _teamsserver
netaccounts                              62
netusers                                 52
network                                  69
nobody                           4294967294
nogroup                                  -1
operator                                  5 root
owner                                    10
procmod                                   9 root
procview                                  8 root
staff                                    20 root
sys                                       3 root
tty                                       4 root
utmp                                     45
wheel                                     0 root

Членство в группах для пользователя

Другой распространенной задачей может быть печать списка всех групп для данного пользователя:

grp_groups_for_user.py

import grp

username  'dhellmann'
group_names  set(
    g.gr_name
    for g in grp.getgrall()
    if username in g.gr_mem
)
print(username, 'belongs to:', ', '.join(sorted(group_names)))

Набор уникальных имен групп сортируется перед печатью.

$ python3 grp_groups_for_user.py

dhellmann belongs to: _appserveradm, _appserverusr, _lpadmin, ad
min, com.apple.sharepoint.group.1

Поиск группы по имени

Как и в случае с pwd, также можно запрашивать информацию о конкретной группе по имени или числовому идентификатору.

grp_getgrnam.py

import grp

name  'admin'
info  grp.getgrnam(name)
print('Name    :', info.gr_name)
print('GID     :', info.gr_gid)
print('Password:', info.gr_passwd)
print('Members :', ', '.join(info.gr_mem))

Группа admin состоит из двух членов:

$ python3 grp_getgrnam.py

Name    : admin
GID     : 80
Password: *
Members : root, dhellmann

Поиск группы по идентификатору

Чтобы идентифицировать группу, в которой выполняется текущий процесс, объедините getgrgid () с os.getgid () .

grp_getgrgid_process.py

import grp
import os

gid  os.getgid()
group_info  grp.getgrgid(gid)
print('Currently running with>{}>{}'.format(
    gid, group_info.gr_name))
$ python3 grp_getgrgid_process.py

Currently running with

Чтобы получить имя группы на основе прав доступа к файлу, найдите группу, возвращаемую os.stat () .

grp_getgrgid_fileowner.py

import grp
import os

filename  'grp_getgrgid_fileowner.py'
stat_info  os.stat(filename)
owner  grp.getgrgid(stat_info.st_gid).gr_name

print('{} is owned by {} ({})'.format(
    filename, owner, stat_info.st_gid))

Запись о состоянии файла включает данные о владении и правах доступа к файлу или каталогу.

$ python3 grp_getgrgid_fileowner.py

grp_getgrgid_fileowner.py is owned by staff (20)

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