Russian Qt Forum
Ноябрь 25, 2024, 04:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Запуск команды через QProcess от лица SuperUser (Linux)  (Прочитано 13071 раз)
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'и писать. Может там что найду.
« Последнее редактирование: Октябрь 28, 2013, 13:15 от Hrundel » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 26, 2013, 10:54 »

kdesu/gksu. Или настроить sudo, что бы он вообще не спрашивал пароль для запуска данного скрипта.
Записан
Hrundel
Гость
« Ответ #2 : Октябрь 26, 2013, 11:22 »

То есть,  достаточно написать

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

gksu rcnagios restart

Непонимающий

*Еще не пробовал потому, что перезапускаться надо.
« Последнее редактирование: Октябрь 26, 2013, 11:53 от Hrundel » Записан
Hrundel
Гость
« Ответ #3 : Октябрь 26, 2013, 11:59 »

Нарыл еще вот такой вариант

Цитировать
#!/bin/bash
echo myPassword_1234 | sudo -S rcnagios restart
Записан
Hrundel
Гость
« Ответ #4 : Октябрь 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();
« Последнее редактирование: Октябрь 26, 2013, 12:04 от Hrundel » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Октябрь 26, 2013, 12:35 »

Пароли в открытом виде? Не очень это безопасно.
Записан
Hrundel
Гость
« Ответ #6 : Октябрь 26, 2013, 14:33 »

Пароли в открытом виде? Не очень это безопасно.


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

Old, дорогой, ну, предложи безопасное решение. Улыбающийся

Как правильно то написать?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Октябрь 26, 2013, 14:40 »

Как правильно то написать?
IMHO, либо пользователь вводит пароль руками, либо настроить sudo, что бы можно было выполнять нужную команду без ввода пароля вообще. sudo это позволяет.
Записан
Hrundel
Гость
« Ответ #8 : Октябрь 26, 2013, 14:46 »

Тогда, пожалуй лучше руками.
Да, остановлюсь на этом.

Old, большое спасибо.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Октябрь 26, 2013, 16:50 »

есть xdg-su, он использует kdesu/gksu в зависимости от того что установлено. Распространять придётся самому, в дистрах его обычно нет.
Записан
fedya_1981
Гость
« Ответ #10 : Октябрь 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.



Записан
Hrundel
Гость
« Ответ #11 : Октябрь 28, 2013, 11:24 »

Вообще ни один вариант не полчается!!! Пытаюсь остановить выполнение nagios "rcnagios stop"
Проверяю в терминале статус - nsgios как работал так дальше и работает.

Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #12 : Октябрь 28, 2013, 11:29 »

Вообще ни один вариант не полчается!!! Пытаюсь остановить выполнение nagios "rcnagios stop"
Проверяю в терминале статус - nsgios как работал так дальше и работает.

Код возврата и статус процесса в QProcess проверял?
Записан
Hrundel
Гость
« Ответ #13 : Октябрь 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 ?
В терминале она прекрасно работает!
Записан
Hrundel
Гость
« Ответ #14 : Октябрь 28, 2013, 13:14 »

УРА!!! Все заработало!!!   Смеющийся Смеющийся Смеющийся
Проблема была в неправильном пути к файлу.  Строит глазки

Всем спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.264 секунд. Запросов: 23.