Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Получение и изменение идентификаторов пользователя и группы

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

getuid - возвращает реальный идентификатор пользователя

#include <unistd.h>

uid_t getuid(void);

/* Возвращает идентификатор пользователя (коды ошибок не предусмотрены) */

geteuid - возвращает действующий идентификатор пользователя

#include <unistd.h>

uid_t geteuid(void);

/* Возвращает идентификатор пользователя (коды ошибок не предусмотрены) */

getgid - возвращает реальный идентификатор группы

#include <unistd.h>

gid_t getgid(void);

/* Возвращает идентификатор группы (коды ошибок не предусмотрены) */

getegid - возвращает действующий идентификатор группы

#include <unistd.h>

gid_t getegid(void);

/* Возвращает идентификатор группы (коды ошибок не предусмотрены) */

Идентификатор пользователя или группы - это просто некоторое число. Если хотите получить имя, то нужно обратиться к системным вызовам getpwuid и getgrgid.

Правила изменения реального и действующего идентификаторов пользователя и группы достаточно сложны и различаются для обычных процессов и процессов, работающих с правами суперпользователя. Помимо текущих реальных и действующих идентификаторов, для каждого процесса ядро хранит оригинальные действующие идентификаторы, которые были установлены последним вызовом exec. Они называются сохраненные идентификаторы. Ниже приводятся правила изменения идентификатора пользователя (они применимы и для идентификатора группы):

  1. Обычный процесс не может изменить реальный или сохраненный идентификаторы иначе как через вызов exec, который может изменить сохраненный идентификатор.

  2. Обычный процесс может изменить действующий идентификатор на реальный или сохраненный.

  3. Процесс, обладающий правами суперпользователя, может изменить реальный и действующий идентификаторы на любой другой.

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

С суперпользовательскими процессами все понятно - допускается все, что угодно. Два правила, затрагивающие обычные процессы означают следующее: если вызов exec изменил реальный и действующий идентификаторы, то процесс имеет возможность переключаться между ними. Системные вызовы для процесса с правами обычного пользователя - seteuid и setegid:

seteuid - устанавливает действующий идентификатор пользователя

#include <unistd.h>

int seteuid (

uid_t uid /* действующий идентификатор пользователя */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

setegid - устанавливает действующий идентификатор группы

#include <unistd.h>

int setegid (

gid_t gid /* действующий идентификатор группы */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

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

setuid - устанавливает реальный идентификатор пользователя

#include <unistd.h>

int setuid (

uid_t uid /* реальный и сохраненный идентификатор пользователя */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

setgid - устанавливает реальный идентификатор группы

#include <unistd.h>

int setgid (

gid_t gid /* реальный и сохраненный идентификатор группы */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

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

Процесс может получить свой идентификатор и идентификатор предка с помощью системных вызовов:

getpid - возвращает идентификатор процесса

#include <unistd.h>

pid_t getpid(void);

/* Возвращает идентификатор процесса */

getppid - возвращает идентификатор родительского процесса

#include <unistd.h>

pid_t getppid(void);

/* Возвращает идентификатор родительского процесса */