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

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

Жанры

Разработка приложений в среде 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

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Пипец Котенку! 3

Майерс Александр
3. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 3

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода