Разница между функцией setuid и seteuid

Программа 1: Пример с setuid ()

#include #include #include void main() { printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); setuid(1000); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); setuid(1014); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); } 

Выход:

  guest $ ./a.out Real user id = 1000, Effective User id = 1014 Real user id = 1000, Effective User id = 1000 Real user id = 1000, Effective User id = 1014 guest $ 

Программа 2: Пример с помощью seteuid ()

  #include #include #include void main() { printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); seteuid(1000); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); seteuid(1014); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); } 

Выход:

  guest $ ./a.out Real user id = 1000, Effective User id = 1014 Real user id = 1000, Effective User id = 1000 Real user id = 1000, Effective User id = 1014 guest $ 

Обе программы дают одинаковый результат. Итак, в чем разница между этими двумя функциями? В соответствии с ссылкой (справочная страница) обе функции используются для установки эффективного идентификатора пользователя процесса. В чем разница между этими двумя программами?

В документации достаточно ясно о различии:

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

Таким образом, программа set-user-ID-root, желающая временно отказаться от привилегий root, принять личность непривилегированного пользователя, а затем восстановить привилегии root впоследствии не может использовать setuid () . Вы можете выполнить это с помощью seteuid .