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

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

Жанры

Основы программирования в Linux
Шрифт:

Когда пользователь регистрируется в системе Linux, у него или у нее есть имя пользователя и пароль. После того как эти данные проверены, пользователю предоставляется командная оболочка. В системе у пользователя также есть уникальный идентификатор пользователя, называемый UID (user identifier). Каждая программа, выполняемая Linux, запускается от имени пользователя и имеет связанный с ней UID.

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

Поскольку UID — это ключевой параметр для идентификации пользователя, начнем с него.

У UID есть свои тип

uid_t
, определенный в файле sys/types.h. Обычно это короткое целое (small integer). Одни идентификаторы пользователя заранее определены системой, другие создаются системным администратором, когда новые пользователи становятся известны системе. Как правило, идентификаторы пользователей имеют значения, большие 100.

#include <sys/types.h>

#include <unistd.h>

uid_t getuid (void);

char *getlogin(void);

Функция

getuid
возвращает UID, с которым связана программа. Обычно это UID пользователя, запустившего программу.

Функция

getlogin
возвращает регистрационное имя, ассоциированное с текущим пользователем.

Системный файл /etc/passwd содержит базу данных, имеющую дело с учетными записями пользователей. Он состоит из строк по одной на каждого пользователя, в каждую строку включены имя пользователя, зашифрованный пароль, идентификатор пользователя (UID), идентификатор группы (GID), полное имя, исходный каталог и командная оболочка, запускаемая по умолчанию. Далее приведен пример такой строки:

neil:zBqxfqedfpk:500:100:Neil Matthew:/home/neil:/bin/bash

Если вы пишете программу, которая определяет UID пользователя, запустившего ее, то можете расширить ее возможности и заглянуть в файл passwd для выяснения регистрационного имени пользователя и его полного имени. Мы не рекомендуем делать это, потому что современные UNIX-подобные системы уходят от применения файлов учетных записей пользователей для повышения безопасности системы. Многие системы, включая Linux, имеют возможность использовать файлы теневых паролей (shadow password), совсем не содержащие пригодной информации о зашифрованных паролях (она часто хранится в файле /etc/shadow, которые обычные пользователи не могут читать). По этой причине определен ряд функций для предоставления эффективного программного интерфейса, позволяющего получать эту пользовательскую информацию.

#include <sys/types.h>

#include <pwd.h>

struct passwd *getpwuid(uid_t uid);

struct passwd *getpwnam(const char *name);

Структура базы данных учетных записей пользователей

passwd
определена в файле pwd.h и включает элементы, перечисленные в табл. 4.4.

Таблица 4.4

Элемент
passwd
Описание
char *pw_name
Регистрационное имя пользователя
uid_t pw_uid
Номер UID
gid_t pw_gid
Номер GID
char *pw_dir
Исходный каталог пользователя
char *pw_gecos
Полное имя пользователя
char *pw_shell
Командная оболочка пользователя, запускаемая по умолчанию

В некоторых системах UNIX может использоваться другое имя для поля с полным именем пользователя: в одних системах это

pw_gecos
, как в ОС Linux, в других —
pw_comment
. Это означает, что мы не можем рекомендовать его использование. Обе функции (и
getpwuid
, и
getpwnam
) возвращают указатель на структуру
passwd
, соответствующую пользователю. Пользователь идентифицируется по UID в функции
getpwuid
и по регистрационному имени в функции
getpwnam
. В случае ошибки обе функции вернут пустой указатель и установят переменную
errno
.

Выполните упражнение 4.11.

Упражнение 4.11. Информации о пользователе

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

#include <sys/types.h>

#include <pwd.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

int main {

 uid_t uid;

 gid_t gid;

 struct passwd *pw;

 uid = getuid;

 gid = getgid;

 printf("User is %s\n", getlogin);

 printf("User IDs: uid=%d, gid=%d\n", uid, gid);

 pw = getpwuid(uid);

 printf(

"UID passwd entry:\n name=%s, uid=%d, gid=%d, home=%s, shell=%s\n",

pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);

 pw = getpwnam("root");

 printf("root passwd entry:\n");

 printf("name=%s, uid=%d, gid=%d, home=%s, shell=%s\n",

pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);

 exit(0);

}

Программа предоставит следующий вывод, который может слегка отличаться в разных версиях Linux и UNIX:

$ ./user

User is neil

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

Умри завтра

Джеймс Питер
5. Рой Грейс
Детективы:
триллеры
8.92
рейтинг книги
Умри завтра

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Студент из прошлого тысячелетия

Этот мир не выдержит меня. Том 2

Майнер Максим
2. Первый простолюдин в Академии
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Этот мир не выдержит меня. Том 2

Тепличный цветок

Ритчи Криста
2. Сестры Кэллоуэй
Любовные романы:
современные любовные романы
7.57
рейтинг книги
Тепличный цветок

Дневник (1887-1910)

Ренар Жюль
Проза:
проза прочее
4.00
рейтинг книги
Дневник (1887-1910)

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Старый, но крепкий 5

Крынов Макс
5. Культивация без насилия
Фантастика:
рпг
аниме
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 5

Антон Чехов

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Антон Чехов

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Третий. Том 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 4

Страх — это ключ

Маклин Алистер
Детективы:
крутой детектив
6.25
рейтинг книги
Страх — это ключ

Резонанс Ци. Дилогия

Орлов Андрей Юрьевич
Резонанс Ци
Фантастика:
постапокалипсис
рпг
уся
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Резонанс Ци. Дилогия

Лейтенант. Часть 2. Назад в СССР

Гаусс Максим
9. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лейтенант. Часть 2. Назад в СССР