• pw_passwd
может представлять зашифрованный пароль или нечто подобное, связанное с процедурой аутентификации. Зависит от системы.
• pw_uid
представляет номер (обычно уникальный), который используется в ядре для идентификации пользователя.
• pw_gid
представляет главную группу, которую ядро связывает с пользователем.
• pw_gecos
представляет член, зависящий от системы, который хранит информацию о пользователе. Обычно сюда включается настоящее имя пользователя; во многих системах здесь приводится список членов, разделенных запятыми, который включает номера домашних и рабочих телефонов.
• pw_dir
представляет домашний каталог, связанный с пользователем. Обычные сеансы регистрации начинают работать с этим каталогом в качестве текущего каталога.
• pw_shell
представляет имя командной оболочки, которая запускается в случае успешной регистрации пользователя. Сюда обычно относятся /bin/bash
, /bin/tcsh
, bin/zsh
и так далее. Однако элементы, используемые для других целей, могут иметь другие оболочки, /bin/false
применяется для элементов passwd
, которые не используются для регистрации пользователей. Специализированные оболочки часто служат для целей, рассмотрение которых выходит за рамки настоящей книги.
Структура, которая представляет элементы в /etc/group
(или в эквивалентных базах данных), определена в <grp.h>
.
struct group {
char * gr_name; /* Имя группы */
char * gr_passwd; /* Пароль */
__gid_t gr_gid; /* Идентификатор группы */
char ** gr_mem; /* Список членов */
};
• gr_name
представляет уникальное имя группы.
• gr_passwd
представляет пароль (обычно неиспользуемый). К нему применимы те же требования, что и к pw_passwd
, только в еще большей степени.
• gr_gid
представляет номер (обычно неуникальный), который ядро использует для идентификации группы.
• gr_mem
представляет список членов группы, разделенных запятыми. Это список имен пользователей, которые присваиваются этой группе на вторичной основе (см. главу 10).
Существуют две общих причины, по которым производится доступ к системным идентификационным базам данных: если ядро получает номер, а вам необходимо имя, или если какой-то пользователь или какая-то программа предоставляют вам имя, а вы должны сообщить ядру номер. Предусмотрены две функции поиска числовых идентификаторов, getpwuid()
и getgrgid()
, которые принимают целочисленный идентификатор и возвращают указатель на структуру, содержащую информацию из соответствующей системной базы данных. Точно так же имеются две функции, которые производят поиск имен, getpwnam()
и getgrnam()
, и они возвращают те же две структуры.
База данных пользователей | База данных групп | |
---|---|---|
Номер | getpwuid() | getgrgid() |
Имя | getpwnam() | getgrnam() |
Каждая из этих функций возвращает указатели на структуры. Структуры являются статическими и перезаписываются при последующем вызове функции, поэтому если вам по какой-либо причине нужно отслуживать структуру, потребуется сделать ее копию.
Четыре вышеупомянутых функции являются, по сути, сокращениями, предлагающими наиболее часто используемые функции для доступа к системным базам данных. Функции низкого уровня, getpwent()
и getgrent()
, производят итерации по строкам в базе данных вместо поиска конкретной записи. Каждый раз при вызове одной из этих функций она будет считывать другой элемент из соответствующей системной базы данных, и возвращать его. После того как вы завершите чтение элементов, вызовите функцию endpwent()
или endgrent()
, чтобы закрыть файл.
В качестве примера далее приводится функция getpwuid()
, записанная в отношении функции getpwent()
.
struct passwd * getpwuid(uid_t uid) {
struct passwd * pw;
while (pw = getpwent()) {
if (!pw)
/* обнаружена ошибка; * сквозной проход для обработки ошибки */
break;
if (pw->pw_uid == uid) {
endpwent();
return(pw);
}
}
endpwent();
return NULL;
}
28.1.1. Пример: команда id
Команда id
использует многие из этих функций и предлагает несколько хороших примеров работы с ними. Она также использует некоторые функциональные возможности ядра, описанные в главе 10.
1: /* id.с */
2:
3: #include <grp.h>
4: #include <pwd.h>
5: #include <sys/types.h>
6: #include <stdlib.h>
7: #include <stdio.h>