Выполнение команды Linux от имени пользователя root в Qt

Я хочу выполнить команду linux от имени пользователя root из моего кода C++/Qt. В конечном итоге должен быть реализован диалог с запросом корневого доступа, но я не могу жестко закодировать пароль root.

Вот что я сделал до сих пор:

QProcess p;
p.start( "dmidecode" );
p.waitForFinished(-1);

QString p_stdout = p.readAllStandardOutput();
QString p_stderr = p.readAllStandardError();

И это работает для команд, которые не запрашивают привилегии root. Но я хочу реализовать такие команды, как «zypper up» или «dmidecode», которые я не могу выполнить без пароля root.

Возможно что-то можно сделать с void QProcess::setEnvironment ( const QStringList & environment )?

Спасибо


person sivic    schedule 12.08.2011    source источник
comment
Я считаю, что это невозможно сделать только в Qt (стандартным или, по крайней мере, стандартным способом). Однако в KDE есть стандартный способ. Попробуйте поискать в их документации.   -  person Jan Hudec    schedule 12.08.2011
comment
Вам нужно использовать интерфейс диспетчера рабочего стола для запуска команды от имени пользователя root. Например, для Ubuntu вы можете использовать gksudo для интерфейса пароля.   -  person useraged    schedule 12.08.2011


Ответы (3)


Вы не можете повысить свои привилегии, если вы работаете как обычный пользователь, если вы не являетесь suid, что вам, вероятно, не нужно для всего приложения.
Это делается с помощью внешнего помощника; вы хотите что-то, что делает sudo не su, поскольку в Ubuntu учетная запись root заблокирована; gksudo или kdesudo в зависимости от рабочей среды. Один из них должен быть предустановлен в любом современном дистрибутиве Linux, или вы можете развернуть его копию вместе со своим приложением.
Конечно, это не сработает, если у текущего пользователя нет прав запускать что-то через sudo, но это нормальная мера безопасности, и вы не должны ее обходить.

person Torp    schedule 12.08.2011

Добавьте правило в список sudoers для специального пользователя и выполните команду от имени этого пользователя:

sudo *some command*

Вы можете использовать system() или QProcess для этого.

Чтобы узнать, как добавить правило в список sudoers, см. руководство по sudoers.

person BЈовић    schedule 12.08.2011
comment
Есть ли более элегантное решение без создания другого пользователя? - person sivic; 12.08.2011
comment
@sivic Не создавайте другого пользователя, а добавьте текущего пользователя в список sudoers и разрешите ему выполнить какую-либо команду, которую может выполнить только root - person BЈовић; 12.08.2011

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

#it is the shell script code
#!/bin/bash
gksudo /usr/lib/your_qt_app

Чем просто вам просто нужно вызвать файл сценария оболочки. Назовите его myscript и откройте свой bash. Введите туда:

myscript

Обратите внимание на приведенную выше команду gksudo. Эта команда повышает вас до уровня root. Я не знаю более простого ответа, чем этот. Может и не поможет, но я пользуюсь таким способом.

person Ade Malsasa Akbar    schedule 13.11.2013