•
Следующая запись в файле паролей означает, что пользователь 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
struct passwd *getpwnam(const char *
struct passwd *getpwuid(uid_t
Обе функции при успешном завершении возвращают указатель, при ошибке — NULL. Описание для случая «запись не найдена» дается в тексте подраздела
При предоставлении имени в качестве аргумента name функция getpwnam() возвращает указатель на структуру следующего типа, содержащую соответствующую информацию из записи в файле паролей:
struct passwd {
char *pw_name; /* Имя для входа в систему (имя пользователя) */
char *pw_passwd; /* Зашифрованный пароль */
uid_t pw_uid; /* Идентификатор пользователя */
gid_t pw_gid; /* Идентификатор группы */
char *pw_gecos; /* Комментарий (информация о пользователе) */
char *pw_dir; /* Исходный рабочий (домашний) каталог */
char *pw_shell; /* Оболочка входа в систему */
};
Поля pw_gecos и pw_passwd структуры passwd в SUSv3 не определены, но доступны во всех реализациях UNIX. Поле pw_passwd содержит актуальную информацию только при выключенном режиме использования теневых паролей. (С точки зрения программирования наипростейший способ выявить включение режима использования теневых паролей состоит в вызове функции getspnam() (вскоре рассмотрим) сразу же после успешного выполнения функции getpwnam(), чтобы увидеть, сможет ли она возвратить запись теневого пароля для того же имени пользователя.) В некоторых других реализациях в этой структуре предоставляются дополнительные нестандартные поля.
Поле pw_gecos происходит из ранних реализаций UNIX, где в нем содержалась информация для связи с машиной, на которой запущена операционная система General Electric Comprehensive Operating System (GECOS). Хотя эта цель его применения давно устарела, имя поля осталось прежним, а само оно предназначено для записи информации о пользователе.
Функция getpwuid() возвращает точно такую же информацию, что и функция getpwnam(), но ведет поиск по числовому идентификатору пользователя, предоставленному в аргументе uid. Обе функции возвращают указатель на статически выделенную структуру. Эта структура перезаписывается при каждом вызове любой из этих функций (или рассматриваемой далее функции getpwent()).