Other Alias
seteuidОБЗОР
#include <sys/types.h>#include <unistd.h>
int seteuid(uid_t euid);
int setegid(gid_t egid);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
seteuid(), setegid():
- _BSD_SOURCE || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
ОПИСАНИЕ
seteuid() устанавливает эффективный идентификатор пользователя вызывающего процесса. Непривилегированные пользовательские процессы могут менять эффективный идентификатор пользователя только на действительный, эффективный или сохранённый идентификатор пользователя.Тоже самое справедливо при работе setegid() с «групповым» идентификатором, а не «пользовательским».
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.Замечание: есть случаи, когда seteuid() может завершиться с ошибкой даже когда UID вызывающего равен 0; это серьёзная ошибка безопасности — не проверять возвращаемое значение seteuid().
ОШИБКИ
- EINVAL
- Целевой идентификатор пользователя или группы некорректен в этом пользовательском пространстве имён.
- EPERM
- Вызывающий процесс не имеет прав (Linux: не имеет мандата CAP_SETUID, если вызывает seteuid(), или CAP_SETGID, если вызывает setegid()) и euid (и, соответственно, egid) не является действительным, эффективным или сохранённым идентификатором пользователя (группы).
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, 4.3BSD.ЗАМЕЧАНИЯ
Установка эффективного идентификатора пользователя (группы) в сохранённый идентификатор пользователя (группы) возможна с версии Linux 1.1.37 (1.1.38). В других системах надо проверять _POSIX_SAVED_IDS.В glibc 2.0 вызов seteuid(euid)эквивалентен setreuid(-1, euid), и поэтому может изменить сохранённый идентификатор пользователя. В glibc 2.1 и новее он эквивалентен setresuid(-1, euid, -1) и поэтому не изменяет сохранённый идентификатор пользователя. Аналогичные замечания относятся и к setegid(), с той разницей, что изменение в реализации из setregid(-1, egid) в setresgid(-1, egid, -1) произошло в glibc 2.2 или 2.3 (зависит от аппаратной архитектуры).
Согласно POSIX.1, seteuid() (setegid()) необходимо запрещать euid (egid) равный текущему эффективному идентификатору пользователя (группе), и некоторые реализации не позволяют этого.