SETUID(2)

НАЗВАНИЕ
setuid - установить идентификатор пользователя

КРАТКАЯ СВОДКА
#include <sys/types.h>
#include <unistd.h>

int setuid(uid_t uid)

ОПИСАНИЕ
setuid устанавливает фактический идентификатор владельца текущего процесса. Если фактический пользователь, вызвавший эту функцию -- root, то действительный и сохраненный идентификаторы также устанавливаются.

Под Linux setuid реализован как в стандарте POSIX с возможностью _POSIX_SAVED_IDS. Это позволяет setuid-программам (не setuid-root) сбрасывать все привилегии, делать непривилегированную работу, а затем безопасно возвращать себе исходный фактический идентификатор пользователя.

Если пользователь -- root, или программа установлена как setuid root, нужна особенная осторожность. Функция setuid проверяет фактический идентификатор вызвавшего пользователя и, если это суперпользователь, то все идентификаторы устанавливаются в uid. После этого программа уже никак не сможет вернуть обратно права пользователя root.

Таким образом, setuid-root программа, желающая временно сбросить права root, на время сделаться другим пользователем, а затем восстановить права root, не может пользоваться setuid. Требуемого результата можно достичь с помощью вызова seteuid, которого нет в POSIX, но есть в BSD.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха возвращается ноль. При ошибке возвращается -1, а errno устанавливается должным образом.

ОШИБКИ

EPERM
    Пользователь не является суперпользователем, а uid не совпадает с фактическим или сохраненным идентификатором владельца текущего процесса.

СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID, POSIX.1. Этот системный вызов не совсем совместим с 4.4BSD, который устанавливает действительный, сохраненный и фактический идентификаторы пользователя. SVr4 документирует дополнительный код ошибки EINVAL.

ЗАМЕЧАНИЯ ПО СПЕЦИФИКЕ LINUX
Linux поддерживает концепция идентификатора пользователя файловой системы, обычно совпадающего с фактическим идентификатором. Системный вызов setuid также устанавливает идентификатор пользователя файловой системы. Смотри setfsuid(2).

Если uid отличается от старого фактического идентификатора, то процессу нельзя будет создавать файлы дампа памяти (core).

СМОТРИ ТАКЖЕ
getuid(2), setreuid(2), seteuid(2), setfsuid(2)

ПЕРЕВОД
Перевод Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 2000 http://alexm.here.ru/manpages-ru/