Russian Qt Forum

Qt => Общие вопросы => Тема начата: Hrundel от Октябрь 26, 2013, 10:42



Название: [РЕШЕНО] Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 26, 2013, 10:42
Всем привет,

в продолжение к своему предыдущему вопросу хочу спросить о возможности запуска команды от лица SuperUser
У меня nagios установлен под su, и мне после каждой реконфигурации нужно его перезапускать.

для этого я хочу воспользоваться bash

Как уже делал раньше:

Код
C++ (Qt)
QProcess cgiStream;
 
QStringList commands("./cgistream.sh");
 
cgiStream.start("/bin/sh", commands);
cgiStream.waitToFinished();
 
qDebug() << cgiStream.readAllStandardOutput();
 

Мой вопрос: что писать в скрипте для того чтобы получить права su для перезапуска


Цитировать
#!/bin/sh

# здесь нужно получить права SuperUser
#  и наверное как-то с паролем разобраться (без понятия!!!)

restart nagios

Если кто-то решал подобные задачи, подскажите как это реализовать.
я пока пороюсь в инете на тему как bash'и писать. Может там что найду.


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Old от Октябрь 26, 2013, 10:54
kdesu/gksu. Или настроить sudo, что бы он вообще не спрашивал пароль для запуска данного скрипта.


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 26, 2013, 11:22
То есть,  достаточно написать

Цитировать
#!/bin/sh

gksu rcnagios restart

???

*Еще не пробовал потому, что перезапускаться надо.


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 26, 2013, 11:59
Нарыл еще вот такой вариант

Цитировать
#!/bin/bash
echo myPassword_1234 | sudo -S rcnagios restart


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 26, 2013, 12:01
Или вообще даже вот так:

Код
C++ (Qt)
QProcess commandProc;
 
commandProc.start("/bin/bash");
commandProc.waitForStarted(3000);
 
//123456 - пароль. \n - имитирует нажатие Enter.
commandProc.write("echo 123456 | sudo -S rcnagios restart\n");
commandProc.waitForFinished(4000);
 
QByteArray ta = commandProc.readAll();


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Old от Октябрь 26, 2013, 12:35
Пароли в открытом виде? Не очень это безопасно.


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 26, 2013, 14:33
Пароли в открытом виде? Не очень это безопасно.


Согласен, конечно.

Old, дорогой, ну, предложи безопасное решение. :)

Как правильно то написать?


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Old от Октябрь 26, 2013, 14:40
Как правильно то написать?
IMHO, либо пользователь вводит пароль руками, либо настроить sudo, что бы можно было выполнять нужную команду без ввода пароля вообще. sudo это позволяет.


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 26, 2013, 14:46
Тогда, пожалуй лучше руками.
Да, остановлюсь на этом.

Old, большое спасибо.


Название: Re: [РЕШЕНО] Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Alex Custov от Октябрь 26, 2013, 16:50
есть xdg-su, он использует kdesu/gksu в зависимости от того что установлено. Распространять придётся самому, в дистрах его обычно нет.


Название: Re: [РЕШЕНО] Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: fedya_1981 от Октябрь 28, 2013, 08:14
Попробуй так:

QProcess *start_as_root_process=new QProcess(this);
start_as_root_process->start("pkexec",QStringList()<<"--user"<<"root"<<"program_name");

Далее вводишь пароль root.

принудительно убить такой процесс можно так:
QProcess *kill_proc(new QProcess(this));
kill_proc->start("pkexec",QStringList()<<"kill"<<QString("%1").arg(start_open_vpn_process->pid()));
kill_proc->waitForFinished();

Соответственно также необходимо ввести пароль root.





Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 28, 2013, 11:24
Вообще ни один вариант не полчается!!! Пытаюсь остановить выполнение nagios "rcnagios stop"
Проверяю в терминале статус - nsgios как работал так дальше и работает.



Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Alex Custov от Октябрь 28, 2013, 11:29
Вообще ни один вариант не полчается!!! Пытаюсь остановить выполнение nagios "rcnagios stop"
Проверяю в терминале статус - nsgios как работал так дальше и работает.

Код возврата и статус процесса в QProcess проверял?


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 28, 2013, 11:42
Сделал такой запрос:

Код
C++ (Qt)
   QProcess commandProc;
   QString commandLine;
 
   commandLine = "echo " + str + " | sudo -S rcnagios stop\n";
 
   commandProc.start("/bin/bash");
   commandProc.write(commandLine.toUtf8());
   commandProc.waitForFinished();
 
   qDebug() << commandProc.readAllStandardError();
   qDebug() << commandProc.errorString();
 
   qDebug() << commandProc.exitStatus();
   qDebug() << commandProc.exitCode();

Получил такой ответ:

Цитировать
"root's password:sudo: rcnagios: command not found
"
"Process operation timed out"
0
0
QProcess: Destroyed while process is still running.

Не понимаю, какая именно команда не найдена? rcnagios ?
В терминале она прекрасно работает!


Название: Re: Запуск команды через QProcess от лица SuperUser (Linux)
Отправлено: Hrundel от Октябрь 28, 2013, 13:14
УРА!!! Все заработало!!!   ;D ;D ;D
Проблема была в неправильном пути к файлу.  ::)

Всем спасибо!