Подтвердить что ты не робот

Проверьте, является ли пользователь root в C?

Как я могу проверить, является ли пользователь root?

4b9b3361

Ответ 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.