Обычно проверять, является ли пользователь root.POSIX даже не требует наличия пользователя root, но оставляет его реализации, чтобы определить, как работают разрешения.Код, такой как:
if (i_am_root) do_privileged_op(); else print_error();
, действительно раздражает пользователей продвинутыми моделями привилегий, где root не нужен для выполнения необходимых привилегированных операций.Я помню, что в первые дни записи компакт-дисков в Linux мне приходилось взламывать исходный код cdrecord
, чтобы удалить все бесполезные проверки, чтобы увидеть, работает ли он как root, когда он работал нормально с разрешением на чтение * 1005.*.
Вместо этого вы всегда должны пытаться выполнить привилегированную операцию, которую вам нужно выполнить, и проверять наличие EPERM
или аналогичное, если оно не уведомляет пользователя о том, что у него недостаточно привилегий (ивозможно, следует повторить попытку от имени пользователя root.)
Единственный случай, когда полезно проверить наличие root, - это проверка, вызвана ли ваша программа "suid-root".Разумный тест будет выглядеть следующим образом:
uid_t uid=getuid(), euid=geteuid();
if (uid<0 || uid!=euid) {
/* We might have elevated privileges beyond that of the user who invoked
* the program, due to suid bit. Be very careful about trusting any data! */
} else {
/* Anything goes. */
}
Обратите внимание, что я учел возможность (надуманную, но лучше параноидальную), что любой из вызовов для получения uid / euid может потерпеть неудачу, и что вВ случае неудачи мы должны предположить, что мы suid, а злоумышленник каким-то образом вызвал сбой системных вызовов, пытаясь скрыть, что мы suid.