Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

       setreuid,   setregid   -  устанавливает  действительный  и/или  эффективный  идентификатор
       пользователя или группы

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <unistd.h>

       int setreuid(uid_t ruid, uid_t euid);
       int setregid(gid_t rgid, gid_t egid);

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       setreuid(), setregid():
           _XOPEN_SOURCE >= 500
               || /* начиная с glibc 2.19: */ _DEFAULT_SOURCE
               || /* glibc <= 2.19: */ _BSD_SOURCE

ОПИСАНИЕ

       Вызов setreuid() устанавливает действительный  и  эффективный  идентификатор  пользователя
       вызывающего процесса.

       Если  указываемое  значение  действительного  или эффективного идентификатора пользователя
       равно -1, то система не изменяет его.

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

       Непривилегированные  пользователи могут изменять действительный идентификатор пользователя
       на эффективный или действительный идентификатор пользователя.

       Если установлен действительный идентификатор пользователя (т. е., значение ruid  не  равно
       -1)  или  установлено  значение  эффективного  идентификатора  пользователя  в отличное от
       предыдущего значения действительного идентификатора пользователя, то значение сохранённого
       идентификатора пользователя будет установлено в новое значение эффективного идентификатора
       пользователя.

       Аналогично setregid() меняет действующий и эффективный идентификаторы  группы  вызывающего
       процесса, и всё описанное выше для пользователя справедливо и для группы.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       On  success, zero is returned.  On error, -1 is returned, and errno is set to indicate the
       error.

       Замечание: есть случаи, когда setreuid()  может  завершиться  с  ошибкой  даже  когда  UID
       вызывающего  равен  0;  это  серьёзная  ошибка  безопасности  —  не проверять возвращаемое
       значение setreuid().

ОШИБКИ

       EAGAIN Вызов изменил бы настоящего реальный UID вызывающего (т. е.  ruid  не  совпадает  с
              реальным  UID  вызывающего),  но возникла временная ошибка при выделении памяти под
              необходимые структуры ядра.

       EAGAIN Значение ruid не совпадает с реальным UID  вызывающего  и  этот  вызов  создал  был
              превышение  количества  процессов,  принадлежащих  пользователю  с реальным ID ruid
              сверх ограничителя ресурсы RLIMIT_NPROC вызывающего. Начиная с Linux 3.1 эта ошибка
              больше  не  возникает  (но  корректное  приложение  должно  проверять  эту ошибку);
              смотрите описание EAGAIN в execve(2).

       EINVAL Один или более целевых идентификаторов пользователя или группы некорректны  в  этом
              пользовательском пространстве имён.

       EPERM  Вызывающий  процесс  не  имеет  прав  (Linux: не имеет необходимого мандата в своём
              пространстве имён  пользователя:  CAP_SETUID  при  вызове  setreuid()  или  мандата
              CAP_SETGID  при вызове setregid()), а требуемые изменения не относятся к следующим:
              1)  взаимозамене  эффективного  идентификатора  на   действительный   идентификатор
              пользователя  (группы);  2)  установке  значения  одного  идентификатора в значение
              другого; 3) замене эффективного идентификатора пользователя (группы) на сохранённый
              идентификатор пользователя (группы).

СТАНДАРТЫ

       POSIX.1-2001, POSIX.1-2008, 4.3BSD (setreuid() и setregid() впервые появились в 4.2BSD).

ЗАМЕЧАНИЯ

       Установка  эффективного  идентификатора  пользователя  (группы)  в  значение  сохранённого
       идентификатора возможна с версии Linux 1.1.37 (1.1.38).

       В POSIX.1 не определены  все  варианты  изменения  идентификаторов,  разрешённые  в  Linux
       непривилегированным  процессам.  Вызов  setreuid()  может  изменить  значение эффективного
       пользовательского  идентификатора  на  действительный  или  сохранённый   пользовательский
       идентификатор   и   не   определено,   может  ли  непривилегированный  процесс  установить
       действительный пользовательский идентификатор  равным  действительному,  эффективному  или
       сохранённому   пользовательскому   идентификатору.   Вызов   setregid()   может   изменить
       действительный идентификатор группы на  значение  сохранённого  идентификатора  группы,  а
       эффективный   идентификатор   группы   —  на  значение  действительного  или  сохранённого
       идентификатора  группы.  Действующие  правила  о  разрешённых  изменениях  идентификаторов
       отличаются в разных реализациях.

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

       Первоначальные версии системных вызовов  setreuid()  и  setregid()  в  Linux  поддерживали
       только  16-битные идентификаторы пользователей и групп. Позднее в Linux 2.4 были добавлены
       вызовы setreuid32() и  setregid32(),  поддерживающие  32-битные  идентификаторы.  В  glibc
       обёрточные  функции  setreuid()  и setregid() работают одинаково вне зависимости от версий
       ядра.

   Отличия между библиотекой C и ядром
       На уровне ядра  ID  пользователя  и  группы  являются  атрибутами  нити.  Однако  в  POSIX
       требуется,  чтобы  все  нити  в  процессе  имели одинаковые права. В реализации нитей NPTL
       требования POSIX реализованы через обёрточные функции  для  различных  системных  вызовов,
       которые  изменяют  UID  и  GID процесса. В этих функциях (включая setreuid() и setregid())
       используется алгоритмы на основе сигналов, которые следят за тем, что когда у  одной  нити
       изменяются  права,  эти  изменения  выполняются  и для остальных нитей процесса. Подробное
       описание смотрите в nptl(7).

СМ. ТАКЖЕ

       getgid(2), getuid(2), seteuid(2),  setgid(2),  setresuid(2),  setuid(2),  capabilities(7),
       credentials(7), user_namespaces(7)

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства   был   сделан   Alexander   Golubev
       <fatzer2@gmail.com>,  Azamat  Hackimov  <azamat.hackimov@gmail.com>,   Hotellook,   Nikita
       <zxcvbnm3230@mail.ru>,       Spiros       Georgaras       <sng@hellug.gr>,       Vladislav
       <ivladislavefimov@gmail.com>,   Yuri   Kozlov   <yuray@komyakino.ru>   и    Иван    Павлов
       <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.