Автор оригинала: 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)
Смотрите также
- стандартная библиотечная документация для grp
- pwd – считывает данные пользователя из базы паролей.
spwd
– считывает данные пользователя из базы данных теневых паролей.- os – Интерфейсы операционной системы.