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

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

Жанры

Основы программирования в 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

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

Воплощение Похоти

Некрасов Игорь
1. Воплощение Похоти
Фантастика:
юмористическое фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Воплощение Похоти

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Октябрь, который ноябрь

Валин Юрий Павлович
Выйти из боя
Фантастика:
попаданцы
альтернативная история
4.60
рейтинг книги
Октябрь, который ноябрь

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Я - злодейка в дораме. Сезон второй

Вострова Екатерина
2. Выжить в дораме
Фантастика:
уся
фэнтези
сянься
попаданцы
5.00
рейтинг книги
Я - злодейка в дораме. Сезон второй

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

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

На границе империй. Том 10. Часть 3

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

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

Принятие

Хайд Адель
3. История Ирэн
Фантастика:
попаданцы
альтернативная история
фэнтези
6.00
рейтинг книги
Принятие

Неофит

Листратов Валерий
3. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неофит

Кодекс Императора II

Сапфир Олег
2. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора II

Магнатъ

Кулаков Алексей Иванович
4. Александр Агренев
Приключения:
исторические приключения
8.83
рейтинг книги
Магнатъ

Двенадцатая реинкарнация. Трилогия

Богдашов Сергей Александрович
Фантастика:
боевая фантастика
5.60
рейтинг книги
Двенадцатая реинкарнация. Трилогия

Законы рода

Мельник Андрей
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Законы рода