Я пишу приложение, которое требует полномочий пользователя root выполниться. Если выполняется не пользователем root, это выходит и завершается с сообщением perror, таким как:
pthread_getschedparam: Operation not permitted
Я хотел бы подать более удобную для пользователя заявку. Как часть его ранней инициализации я хотел бы, чтобы это проверило, выполняется ли это корнем или нет. И если бы не корень, это представило бы сообщение, указывающее, что это может только быть выполнено корнем и затем завершиться.
Заранее спасибо за Вашу справку.
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 или колесо, так что он скажет "Бегу как кто-то другой".
Я бы рекомендовал НЕ вносить это изменение, а вместо этого улучшил бы ваше сообщение об ошибке. Сомнительно, чтобы ваше приложение действительно было "root"; вместо этого ему нужны определенные привилегии, которые есть у пользователя root, но какие операционные системы с детализированными элементами управления безопасностью могут предоставить приложению без предоставления ему полного доступа root. Даже если это невозможно сейчас, это может быть возможно через 6 месяцев или 2 года, и пользователи будут раздражены, если ваша программа отказывается запускаться на основе обратных предположений о модели разрешений, а не просто проверяет, успешно ли она выполняет. привилегированные операции, которые ему необходимы.
#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;
}
Что вы действительно хотите проверить, так это наличие нужных возможностей (CAP_SYS_NICE
, я думаю, это та возможность, которая вам нужна) см. man-страницы capabilities (7)
и capget (2)
. Таким образом, программа не выдаст ошибку, если у вас есть возможность делать то, что вы хотите, но вы не root.