Файл групп /etc/group содержит по одной строке для каждой группы в системе. Каждая строка, как показано в следующем примере, состоит из четырех полей, отделенных друг от друга двоеточиями:
users: x:100:
jambit: x:106:claus,felli,frank,harti,markus,martin,mtk,paul
Рассмотрим эти поля в порядке следования.
• Имя группы. Как и имя для входа в систему в файле паролей, имя группы можно рассматривать как легко читаемый символьный идентификатор, соответствующий числовому идентификатору группы.
Зашифрованный пароль. Это поле содержит необязательный пароль группы. С появлением возможности принадлежать сразу нескольким группам в наши дни в системах UNIX пароли групп используются крайне редко. Тем не менее в это поле можно поместить пароль группы (привилегированный пользователь может сделать это с помощью команды gpasswd). Если пользователь не входит в группу, newgrp(1) запрашивает этот пароль перед запуском новой оболочки. Если включены теневые пароли, это поле игнорируется (в этом случае по соглашению в нем содержится только буква x, но вместо нее может указываться любая строка, включая пустую), а зашифрованный пароль в действительности хранится в теневом файле групп, /etc/gshadow, доступ к которому могут получить только привилегированные пользователи или программы. Пароли групп шифруются точно таким же образом, что и пароли пользователей (см. раздел 8.5).
Идентификатор группы (GID). Это числовой идентификатор для данной группы. Как правило, есть группа, имеющая в качестве идентификатора число 0, — это группа с названием root (так же как и запись в /etc/passwd с пользовательским идентификатором со значением 0). В Linux 2.2 и более ранних версиях идентификаторы групп хранились в виде 16-битных значений, позволяющих иметь ID в диапазоне от 0 до 65 535. В Linux 2.4 и более поздних версиях идентификаторы хранятся с использованием 32 бит.
• Список пользователей. Это список, элементы которого отделены друг от друга запятыми. Он содержит имена пользователей, входящих в данную группу. (Список состоит из имен пользователей, а не из пользовательских идентификаторов, поскольку, как уже упоминалось, UID в файле паролей не обладают обязательной уникальностью.)
Следующая запись в файле паролей означает, что пользователь avr входит в группы users, staff и teach:
avr: x:1001:100:Anthony Robins:/home/avr:/bin/bash
А в файле групп будут такие записи:
users: x:100:
staff: x:101:mtk,avr,martinl
teach: x:104:avr,rlb,alc
В четвертом поле записи в файле паролей содержится идентификатор группы 100, указывающий на то, что пользователь входит в группу users. Вхождение в остальные группы показывается за счет однократного присутствия avr в каждой соответствующей записи файла групп.
В этом разделе мы рассмотрим библиотечные функции, позволяющие извлекать отдельные записи из файлов паролей, групп и их теневых аналогов, а также сканировать все записи в каждом из этих файлов.
Извлечение записей из файла паролей
Извлечение записей из файла паролей проводится с помощью функций getpwnam() и getpwuid().
#include <pwd.h>
struct passwd *getpwnam(const char *name);
struct passwd *getpwuid(uid_t uid);
Обе функции при успешном завершении возвращают указатель, при ошибке — NULL. Описание для случая «запись не найдена» дается в тексте подраздела
При предоставлении имени в качестве аргумента name функция getpwnam() возвращает указатель на структуру следующего типа, содержащую соответствующую информацию из записи в файле паролей:
struct passwd {