Зашифрованный пароль. Это поле содержит необязательный пароль группы. С появлением возможности принадлежать сразу нескольким группам в наши дни в системах 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 в каждой соответствующей записи файла групп.

8.4. Извлечение информации о пользователях и группах

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

Извлечение записей из файла паролей

Извлечение записей из файла паролей проводится с помощью функций getpwnam() и getpwuid().

#include

struct passwd *getpwnam(const char *name);

struct passwd *getpwuid(uid_t uid);

Обе функции при успешном завершении возвращают указатель, при ошибке — 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()).

Перейти на страницу:

Похожие книги