Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

Дополнительный, более продвинутый API для поиска коллекций данных описан в разделе 14.4 «Расширенный поиск с использованием двоичных деревьев».

6.3. Имена пользователей и групп

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

Ранние системы Unix хранили информацию, сопоставляющую имена с номерами ID, в простых текстовых файлах

/etc/passwd
и
/etc/group
. На современных системах эти файлы до сих пор существуют, а их формат не изменился после V7 Unix. Однако, они больше не определяют данные полностью. Большие установленные системы с множеством
сетевых хостов хранят сведения в сетевых базах данных, которые представляют собой способ хранения информации на небольшом числе серверов, доступ к которым осуществляется через сеть [69] . Однако, такое использование прозрачно для большинства приложений, поскольку доступ к информации осуществляется через тот самый API, который использовался для получения сведений из текстовых файлов. Именно по этой причине POSIX стандартизует лишь API; в совместимой с POSIX системе файлы
/etc/passwd
и
/etc/group
не обязательно должны существовать.

69

Типичные сетевые базы данных включают Network Information Service (NIS) и NIS+ от Sun Microsystems, Kerberos (Hesiod), MacOS X NetInfo (версии вплоть до и включая 10.2) и LDAP, Lightweight Directory Access Protocol. Системы BSD хранят сведения в базах данных на диске и автоматически создают файлы

/etc/passwd
и
/etc/group
Примеч. автора.

API для этих двух баз данных похожи; большая часть обсуждения фокусируется на базе данных пользователей.

6.3.1. База данных пользователей

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

$ grep arnold /etc/passwd

arnold:x:2076:10:Arnold D. Robbins:/home/arnold:/bin/bash

По порядку эти поля следующие:

Имя пользователя

Это то, что пользователь набирает при регистрации, что отображается с помощью '

ls -l
', а также используется в любом другом контексте при отображении пользователей.

Поле пароля

На старых системах здесь хранился зашифрованный пароль пользователя. На новых системах в этом поле скорее всего стоит x (как в данном случае), это означает, что сведения о пароле находятся в другом файле. Это разделение является средством обеспечения безопасности; если непривилегированному пользователю недоступен зашифрованный пароль, его значительно сложнее «взломать».

ID пользователя

Должен быть уникальным; один номер на пользователя.

ID группы

Это номер ID начальной группы пользователя. Как обсуждается далее, на современных системах с процессами связаны несколько групп.

Настоящее имя пользователя

Это по крайней мере имя и фамилия пользователя. Некоторые системы допускают разделяемые запятыми поля для местоположения офиса, номера телефона и т.д., но это не стандартизовано.

Входной каталог

Этот каталог становится домашним каталогом для пользователей, когда они зарегистрируются в системе (

$HOME
— по умолчанию для команды
cd
).

Входная программа

Программа, которая запускается при регистрации пользователя. Обычно это оболочка, но не обязательно. Если это поле оставлено пустым, по умолчанию используется

/bin/sh
.

Доступ к базе данных пользователей осуществляется через процедуры, объявленные в

<pwd.h>
:

#include <sys/types.h> /* XSI */

#include <pwd.h>

struct passwd *getpwent(void);

void setpwent(void);

void endpwent(void);

struct passwd *getpwnam(const char *name);

struct passwd *getpwuid(uid_t uid);

Поля

в
struct passwd
, использующиеся различными процедурами API, напрямую соответствуют полям файла паролей.

struct passwd {

 char *pw_name; /* имя пользователя */

 char *pw_passwd; /* пароль пользователя */

 uid_t pw_uid; /* id пользователя */

 gid_t pw_gid; /* id группы */

 char *pw_gecos; /* настоящее имя */

 char *pw_dir; /* домашний каталог */

 char *pw_shell; /* программа оболочки */

};

(Имя

pw_gecos
историческое; когда разрабатывались ранние системы Unix, это поле содержало соответствующие сведения для учетной записи пользователя на системах Bell Labs Honeywell с операционной системой GECOS.)

Назначение каждой процедуры описано в следующем списке.

struct passwd *getpwent(void)

Возвращает указатель на внутреннюю структуру

static struct passwd
, содержащую сведения о «текущем» пользователе. Эта процедура читает всю базу данных паролей, по одной записи за раз, возвращая указатель на структуру для каждого пользователя. Каждый раз возвращается тот же самый указатель; т.е. для каждой записи пользователя внутренняя
struct passwd
переписывается заново. Когда
getpwent
достигает конца базы данных паролей, она возвращает
NULL
. Таким образом, она позволяет пройти через всю базу данных по одному пользователю за раз. Порядок, в котором возвращаются записи, не определен.

void setpwent(void)

Сбрасывает внутреннее состояние, так что следующий вызов

getpwent
возвращает первую запись в базе данных паролей.

void endpwent(void)

«Закрывает базу данных», так сказать, будь то простой файл, сетевое соединение или что-нибудь еще.

struct passwd *getpwnam(const char *name)

Ищет пользователя с членом

pw_name
, соответствующим
name
, возвращая указатель на
static struct passwd
, описывающий пользователя, или
NULL
, если пользователь не найден.

struct passwd *getpwuid(uid_t uid)

Сходным образом ищет пользователя с номером ID, приведенным в

uid
, возвращая указатель на
static struct passwd
, описывающий пользователя, или
NULL
, если пользователь не найден.

getpwuid
— вот что нужно, когда есть номер ID пользователя (такой, как в
struct stat
) и вам нужно вывести имя соответствующего пользователя.
getpwnam
преобразует имя в номер ID пользователя, например, если вы хотите использовать с файлом
chown
или
fchown
. Теоретически обе эти процедуры осуществляют линейный поиск по базе данных паролей для обнаружения нужных сведений. На практике это верно, когда используется файл паролей, однако, кулуарные базы данных (сетевые или другие, как на системах BSD) склоняются к использованию более эффективных методов хранения, так что эти вызовы, возможно, в таком случае не такие дорогие [70] .

70

К сожалению, если производительность является проблемой, нет стандартных способов узнать, как ваша библиотека осуществляет работу, а на самом деле способ ее работы может варьировать во время исполнения! (См. справочную страницу nsswitchconf(5) в системе GNU/Linux.) С другой стороны, назначением API помимо всего прочего является сокрытие деталей — Примеч. автора.

Поделиться:
Популярные книги

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Уникум

Поселягин Владимир Геннадьевич
1. Уникум
Фантастика:
альтернативная история
4.60
рейтинг книги
Уникум

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Звезданутые

Курилкин Матвей Геннадьевич
Фантастика:
космическая фантастика
попаданцы
5.50
рейтинг книги
Звезданутые

Мы - истребители

Поселягин Владимир Геннадьевич
2. Я - истребитель
Фантастика:
альтернативная история
8.55
рейтинг книги
Мы - истребители

Отморозок 1

Поповский Андрей Владимирович
1. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 1

Родословная. Том 1

Ткачев Андрей Юрьевич
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 1

Призыватель нулевого ранга. Том 2

Дубов Дмитрий
2. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Призыватель нулевого ранга. Том 2

Вперед в прошлое 5

Ратманов Денис
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 5

Двойник Короля 6

Скабер Артемий
6. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 6

Первый среди равных. Книга X

Бор Жорж
10. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга X