Как мое приложение C/C++ может определить, выполняет ли пользователь root команду?

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

    pthread_getschedparam: Operation not permitted

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

Заранее спасибо за Вашу справку.

5
задан mrflash818 26 October 2018 в 20:45
поделиться

4 ответа

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

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

Добавленный e в geteuid означает эффективный . Он проверяет действующие учетные данные.

Например, если вы используете 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 или колесо, так что он скажет "Бегу как кто-то другой".

12
ответ дан 18 December 2019 в 05:24
поделиться

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

12
ответ дан 18 December 2019 в 05:24
поделиться
#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;
}
8
ответ дан 18 December 2019 в 05:24
поделиться

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

5
ответ дан 18 December 2019 в 05:24
поделиться