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

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

Жанры

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

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

Я еще барон. Книга III

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

Тринадцатый

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

Личный аптекарь императора. Том 3

Карелин Сергей Витальевич
3. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 3

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Имперец. Земли Итреи

Игнатов Михаил Павлович
11. Путь
Фантастика:
героическая фантастика
боевая фантастика
5.25
рейтинг книги
Имперец. Земли Итреи

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

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

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

Забытые боги

Рокотов Алексей
4. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Забытые боги

"Охотник". Компиляция. Книги 1-12

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
5.00
рейтинг книги
Охотник. Компиляция. Книги 1-12

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Роза ветров

Кас Маркус
6. Артефактор
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Роза ветров

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

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

Женить босса срочно!

Верди Алиса
Служебные романы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Женить босса срочно!