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

на главную

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

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

setfsuid
для явной установки fsuid.

int setfsuid(uid_t uid);

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

setfsuid
выполняется успешно, если fsuid остается неизменным или эффективный uid процесса равен 0.

10.2.4. Резюме по идентификаторам пользователей и групп

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

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

Все эти функции возвращают

– 1
в случае ошибки и
0
— в случае успеха, если только не указано иначе. Большинство их прототипов находятся в
<unistd.h>
. Те, что расположены где-то еще, отмечены ниже.

int setreuid(uid_t ruid, uid_t euid);
Устанавливает действительный uid текущего процесса в
ruid
и эффективный uid процесса в
euid
. Если оба параметра равны
– 1
, то uid остаются неизменными.
int setregid(gid_t rgid, gid_t egid);
Устанавливает действительный gid текущего процесса в
rgid
и эффективный gid процесса в
egid.
Если оба параметра равны
– 1
, то gid остаются неизменными.
int setuid(uid t uid);
Если применяется обычным пользователем, то устанавливает эффективный uid текущего процесса в значение параметра
uid
. Если используется процессом с эффективным uid, равным 0, то устанавливает действительный, эффективный и сохраненный uid в значение параметра
uid
.
int setgid(gid_t gid);
Если применяется обычным пользователем, то устанавливает эффективный gid текущего процесса в значение параметра
gid
. Если используется процессом с эффективным gid, равным 0, то устанавливает действительный, эффективный и сохраненный gid в значение параметра
gid
.
int seteuid(uid_t uid);
Эквивалент
setreuid(-1, uid)
.
int setegid(gid_t gid);
Эквивалент
setregid(-1, gid)
.
int setfsuid(uid_t fsuid);
Устанавливает fsuid текущего процесса в значение параметра
fsuid
. Прототип находится в
<sys/fsuid.h>
. Возвращает предшествующий fsuid.
int setfsgid(gid_t fsgid);
Устанавливает fsgid текущего процесса в значение параметра
fsgid
. Прототип находится в
<sys/fsuid.h>
. Возвращает предшествующий fsgid.
int setgroups(size_t num, const gid_t * list);
Устанавливает дополнительные группы текущего процесса из списка, переданного в массиве
list
, который должен содержать
num
элементов. Макрос
SC_NGROUPS_MAX
указывает, сколько групп может быть в списке (от 32 до 65536, в зависимости от работающей у вас версии Linux).
uid_t getuid;
Возвращает действительный uid процесса.
uid_t geteuid;
Возвращает эффективный uid процесса.
gid_t getgid;
Возвращает действительный gid процесса.
gid_t getegid;
Возвращает эффективный gid процесса.
size_t getgroups (size_t size, gid_t list[]);
Возвращает текущий набор дополнительных групп процесса в массиве
list
. Параметр
size
сообщает, сколько элементов типа
gid_t
может содержать
list
. Если размер
list
недостаточен, чтобы вместить все группы, возвращается
– 1
, а
errno
устанавливается в
EINVAL
. В противном случае возвращается фактическое количество групп в
list
. Если
size
равен
0
, возвращается количество групп, но
list
не затрагивается. Прототип функции
getgroups
находится в
<grp.h>
.

10.3. Информация о процессе

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

10.3.1. Аргументы программы

Есть два типа значений, передаваемых новым программам при их запуске: аргументы командной строки и переменные окружения. Для их использования установлено множество соглашений, но система сама по себе не придерживается их автоматически. Однако хорошим тоном считается придерживаться этих соглашений, чтобы помочь вашим программам попасть в мир Unix.

Аргументы командной строки — это набор строк, передаваемый программе. Обычно они представляют собой текст, набранный вслед за именем команды в оболочке, с необязательными аргументами, начинающимися с символа "минус"

(-
).

Переменные окружения — это набор пар "имя-значение". Каждая пара представляет отдельную строку в форме

ИМЯ=ЗНАЧЕНИЕ
, и набор таких строк образует окружение (environment) программы. Например, домашний каталог текущего пользователя обычно указан в переменной окружения HOME, поэтому программы, скажем, пользователя Joe часто запускаются, имея в своем окружении
HOME=/home/joe
.

И аргументы, и окружение становятся доступными программе при запуске. Аргументы командной строки передаются в виде параметров главной функции программы —

main
, в то время как указатель на окружение помещается в глобальную переменную
environ
, которая определена в
<unistd.h>
[18] .

Ниже представлен полный прототип функции

main
в мире Linux, Unix и языка ANSI/ISO С.

int main(int argc, char *argv[]);

18

Большинство систем передают окружение в виде параметра

main
, но такой метод не включен в стандарт POSIX. Переменная
environ
 — это метод, утвержденный POSIX.

Возможно, вас удивит, что

main
возвращает значение (отличное от
void
). Это значение, возвращаемое функцией main, передается родительскому процессу после завершения данного. По соглашению 0 означает, что процесс завершен успешно, а ненулевое значение означает возникновение сбоя. При этом принимаются во внимание только младшие 8 бит из этого кода возврата. Отрицательные значения от -1 до -128 зарезервированы для ненормального завершения процессов по инициативе другого процесса или ядра системы. Код выхода 0 сигнализирует об успешном завершении, а значения от 1 до 127 говорят о том, что программа завершена по ошибке.

Первый параметр,

argc
, содержит количество аргументов командной строки, переданных программе, тогда как
argv
— массив указателей на строки — хранит сами аргументы. Первый элемент в массиве,
argv[0]
, содержит имя вызванной программы (хотя и не обязательно полный путь к ней). В элементе
argv[argc-1]
расположен указатель на завершающий аргумент командной строки, а
argv[argc]
содержит
NULL
.

Чтобы получить прямой доступ к окружению, используйте следующую глобальную переменную:

extern char *environ[];

Это представляет

environ
как массив указателей на каждый элемент программного окружения (помните, каждый элемент — это пара
ИМЯ=ЗНАЧЕНИЕ
), и финальный элемент массива содержит
NULL
. Это объявление находится в
<unistd.h>
, поэтому вам не обязательно объявлять его самостоятельно.

Наиболее общий способ проверки элементов окружения — это вызов

getenv
, который исключает непосредственное обращение к переменной
environ
.

const char *getenv(const char * name);

Единственный параметр

getenv
— это имя переменной окружения, значение которой интересует. Если переменная существует,
getenv
вернет указатель на ее значение. Если переменная не существует в текущем окружении (то есть окружении, на которое указывает
environ
), функция вернет
NULL
.

Linux предоставляет два способа добавления строк в программное окружение:

setenv
и
putenv
. POSIX определяет только
putenv
, что делает его более переносимым.

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

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Темный Патриарх Светлого Рода

Лисицин Евгений
1. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода

Барон играет по своим правилам

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

Таблеточку, Ваше Темнейшество?

Алая Лира
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Таблеточку, Ваше Темнейшество?

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

(Не) Все могут короли

Распопов Дмитрий Викторович
3. Венецианский купец
Фантастика:
попаданцы
альтернативная история
6.79
рейтинг книги
(Не) Все могут короли

Ваше Сиятельство 5

Моури Эрли
5. Ваше Сиятельство
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Ваше Сиятельство 5

Хроники разрушителя миров. Книга 9

Ермоленков Алексей
9. Хроники разрушителя миров
Фантастика:
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хроники разрушителя миров. Книга 9

Полководец поневоле

Распопов Дмитрий Викторович
3. Фараон
Фантастика:
попаданцы
5.00
рейтинг книги
Полководец поневоле

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2