Выполнение команды 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)


arrow_upward
1
arrow_downward

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

person Torp    schedule 12.08.2011

arrow_upward
0
arrow_downward

Добавьте правило в список 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

arrow_upward
0
arrow_downward

Как насчет того, чтобы в любом случае продолжать использовать свой код, но создать сценарий оболочки для своего приложения и поместить его в /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