LINUX.ORG.RU

[Qt] запуск процесса от имени root

 


0

0

Учу Qt, при написании учебной программки наткнулся на грабли, не могу разобраться, как запустить процесс от имени root. До этого запросто запускал процессы вроде 'ifconfig', получал output благодаря QProcess var, var.start(), var.readAll(). Но если я пытаюсь запхнуть sudo в var.start("sudo /foo"), то не получаю вообще никакой реакции.. Подскажите, пожалуйста, что мне нужно делать?

P.S. на данный момент учу Qt по книге Макса Шлее "Qt4 профессиональное программирование на c++", но там больше о винде, чем о линуксе, возможно вы посоветуете мне что-нибудь лучше? :)

Заранее спасибо!

★★★

не использовать root, да еще и вместе с Qt

P1XeL
()
Ответ на: комментарий от Gorthauer

>а kdesu или gksu уже не модны да?

а ты юморной:

1 gksu в Qt приложении это рельно сильно!!!

2 kdesu, по меньшей мере не разумно дашь kdelibs только ради этого!!!

ЗЫ при возникновении такой нужны, переписал бы для себя kdesu отвязав его от kdelibs, это не трудно. Можно поискать на QtApps, может кто-то это уже сделал.

erfea ★★★★★
()
Ответ на: комментарий от Unnamed_Hero

Пардон за длительную паузу перед ответом, учеба настигла внезапно :) Спасибо всем за то, что откликнулись, многие ваши предположения дали мне направления к движению, но я таки вернулся к граблям.

var.start( «sudo», QStringList() << «/foo» ) - не делает ровным счетом ничего. Не ругается, не матюкается, даже не чешется. Можно сделать startDetached, но как туда впхнуть пароль? Я не нашел такого пути решения и пошел по другому, вздохнул и начал рыть исходники kdesu. Рыл глубоко и нарыл в итоге, что они пользуются execvp глубоко в подземельях kprocess. Но это только для запуска самого процесса, а вот пароль ему передается через writestdin, который мой ум уже на ночь не смог постичь, к сожалению. Вот приблизительная попытка просто запустить хотя бы что-то, требующее права рута:

сhar ** temp;
char tt[] = "sudo";

temp = (char **)calloc(1, sizeof(char *));
temp[0] = (char *)calloc(5, sizeof(char));
strcpy(temp[0], tt);
execvp("/temp", temp);
Поругать меня можно за все с чистой совестью, только если предлагаете какой-то дельный вариант решения моей проблемы :) Догадываюсь, что всю ту муть с указателями можно сделать проще и быстрее, прошу лишь сделать скидку на усталось и неопытность.

gavlig ★★★
() автор топика
Ответ на: комментарий от gavlig

>var.start( "sudo", QStringList() << "/foo" ) - не делает ровным счетом ничего.

Значит "/foo" нет в sudoers.

>как туда впхнуть пароль?

QProcess::readyReadStandardOutput()

QProcess::readAllStandardOutput()

QIODevice::write()

summatus
()
Ответ на: комментарий от summatus

Возможно, я чего-то недопонимаю, но как файл может быть в sudoers? пользователь, которым я пытаюсь запустить его в sudoers есть. О существовании write я чуть-чуть знаю, но мои знания бесполезны, если я не могу просто запустить процесс.

Еще околонаучный вопрос - можно ли, запустив процесс в startDetached, сделать ему write?

gavlig ★★★
() автор топика
Ответ на: комментарий от gavlig

>как файл может быть в sudoers?

User_Alias ADMIN = username
Cmnd_Alias CMDS = /foo
ADMIN = NOPASSWD: CMDS

или просто

username = NOPASSWD: /foo

При запуске /foo пароль будет не нужен, man sudoers.

>Еще околонаучный вопрос - можно ли, запустив процесс в startDetached, сделать ему write?


startDetached не обязательно. Наверное тебе удобнее делать start(). Затем ждёшь сигнала QProcess::readyReadStandardOutput(), читаешь вывод var.readAllStandardOutput(), затем var.write("PASS")

summatus
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.