#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 $
#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 .