Проверить, является ли пользователь root в C? - PullRequest
36 голосов
/ 12 ноября 2010

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

Ответы [ 3 ]

57 голосов
/ 12 ноября 2010

Обычно проверять, является ли пользователь 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.

31 голосов
/ 12 ноября 2010

getuid или geteuid, в зависимости от того, что вы действительно имеете в виду.В любом случае 0 означает корень.

if(geteuid() != 0)
{
  // Tell user to run app as root, then exit.
}

Точка, указанная буквой R, действительна.Вы должны рассмотреть метод проб и ошибок, или другой подход, который явно не требует root.

0 голосов
/ 17 июля 2018

лучше использовать getuid или geteuid, но он находится в заголовочном файле zconf.h, и вы должны ввести его, как показано ниже:

#include <zconf.h>
#include <stdio.h>
int main()
{
int a;
a=getuid();
//or you can use  a=geteuid();
//euid is effective user id and uid is user id 
// both euid and uid are zero when you are root user 
if (a==0){
printf("you are root user");
//so you can do what`enter code here`ever `enter code here` you want as root user
}
else
printf("please run the script as root user !");
return 0;
} 
...