Как мое приложение C / C ++ может определить, выполняет ли команда root пользователь? - PullRequest
5 голосов
/ 09 июля 2010

Я пишу приложение, для выполнения которого требуются привилегии пользователя root.Если выполняется пользователем без полномочий root, он завершается и завершается сообщением perror, таким как:

    pthread_getschedparam: Operation not permitted

Я хотел бы сделать приложение более удобным для пользователя.Как часть его ранней инициализации, я хотел бы проверить, выполняется ли это пользователем root или нет.И если не root, он выдаст сообщение о том, что он может быть запущен только пользователем root, а затем завершит работу.

Заранее благодарен за помощь.

Ответы [ 4 ]

12 голосов
/ 09 июля 2010

Я бы порекомендовал НЕ сделать это изменение, но вместо этого улучшить ваше сообщение об ошибке.Сомнительно, что ваше приложение действительно должно быть «root»;вместо этого ему нужны определенные привилегии, которые есть у root, но какие операционные системы с детальными элементами управления безопасностью могут предоставить приложению без предоставления ему полного доступа root.Даже если это сейчас невозможно, это может произойти через 6 месяцев или 2 года, и пользователи будут раздражены, если ваша программа отказывается запускаться на основе обратных предположений о модели разрешений, а не просто проверяет, что она успешно выполняетсянеобходимые привилегированные операции.

12 голосов
/ 09 июля 2010

getuid или geteuid будет очевидным выбором.

getuid проверяет учетные данные фактического пользователя.

Добавлено e в geteuid означает effective. Проверяет действительные учетные данные.

Например, если вы используете sudo для запуска программы от имени пользователя root (суперпользователь), ваши действительные учетные данные остаются вашей учетной записью, а действительные учетные данные - учетная запись root (или члена группы wheel) и т. д.)

Например, рассмотрим код, подобный следующему:

#include <unistd.h>
#include <iostream>

int main() { 
    auto me = getuid();
    auto myprivs = geteuid();


    if (me == myprivs)
        std::cout << "Running as self\n";
    else
        std::cout << "Running as somebody else\n";
}

Если вы запустите это нормально, getuid() и geteuid() вернут одно и то же значение, поэтому он скажет «работает как сам». Если вы вместо этого сделаете sudo ./a.out, getuid() все равно вернет ваш идентификатор пользователя, но geteuid() вернет учетные данные для пользователя root или wheel, поэтому он скажет: «Работать как кто-то другой».

7 голосов
/ 09 июля 2010
#include <unistd.h> // getuid
#include <stdio.h> // printf

int main()
{
    if (getuid()) printf("%s", "You are not root!\n");
    else printf("%s", "OK, you are root.\n");
    return 0;
}
5 голосов
/ 09 июля 2010

Что вы действительно хотите проверить, так это если у вас установлен правильный набор возможностей (CAP_SYS_NICE Я думаю, что это именно то, что вам нужно), смотрите справочные страницы capabilities (7) и capget (2), так что это не выдаст ошибку, если выиметь возможность делать то, что вы хотите, но вы не root.

...