Как я могу проверить, является ли пользователь root?
Проверьте, является ли пользователь root в C?
Ответ 1
Обычно это ошибка, чтобы проверить, является ли пользователь root. POSIX даже не требует пользователя root, но оставляет его для реализации, чтобы определить, как работают разрешения. Код, например:
if (i_am_root) do_privileged_op(); else print_error();
действительно раздражает пользователей с расширенными моделями привилегий, где root не требуется для выполнения необходимых привилегированных операций. Я помню еще в первые дни записи компакт-дисков в Linux, мне пришлось взломать весь источник cdrecord
, чтобы удалить все бесполезные проверки, чтобы убедиться, что он работает от имени пользователя root, когда он работал нормально с разрешения на чтение /dev/sga
.
Вместо этого вы всегда должны пытаться выполнить привилегированную операцию, которую необходимо выполнить, и проверить на 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.
Ответ 2
getuid
или geteuid
, в зависимости от о том, что вы на самом деле имеете в виду. В любом случае 0 означает root.
if(geteuid() != 0)
{
// Tell user to run app as root, then exit.
}
Точка, сделанная R, действительна. Вы должны рассмотреть проб и ошибок или другой подход, который явно не требует root.