Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Как выполнить команду через sudo

Автор: AndreyR 18.2.2011, 19:46

Здравствуйте. Возникла необходимость выполнить в программе на Linux команду fdisk, которая требует админских привилегий. Попытался выполнять ее через sudo, но проблема в том, что вызывая, например, sudo fdisk -l /dev/sda через QProcess, не получается передать sudo пароль. Пытался загружать его вот так:

commandProc.start("sudo", params);
commandProc.waitForStarted(30000);
commandProc.write(password);
commandProc.closeWriteChannel();
commandProc.waitForFinished(4000);

но получается "unknown error". Подскажите пожалуйста, можно ли выполнить sudo как-нибудь по другому? Есть вариант использовать команды gksudo, kdesudo, но как-то это мудрено, опять таки зависимость от оконной среды, не хочется прибегать к таким мутным вариантам.

О :blink: Не в тот раздел попал, перенесите пожалуйста

Автор: Litkevich Yuriy 18.2.2011, 20:04

Цитата(AndreyR @ 18.2.2011, 21:46) *
не получается передать sudo пароль
лучше, ждать отклика приложения (sudo), т.е. ловить то что оно печатает. Наверняка оно печатает, что-то типа:
"enter password:"
и только потом ожидает пароля

Автор: kwisp 19.2.2011, 9:56

AndreyR,
в ман по sudo загляни - там есть ключик -S
так вот с ним sudo считывает пароль со стандартного ввода
тебе надо сделать примерно так

echo "твой пароль" | sudo -S fdisk -l /dev/sda

Автор: AndreyR 20.2.2011, 20:38

kwisp, спасибо. Сработало.
Может кому-то пригодится, я делал вот так:

commandProc.start("/bin/bash");
commandProc.waitForStarted(3000);

//123456 - пароль. \n - имитирует нажатие Enter.
commandProc.write("echo 123456 | sudo -S fdisk -l /dev/sda\n");
commandProc.waitForFinished(4000);

QByteArray ta = commandProc.readAll();


Получается только если запустить bash. Вызов sudo напрямую через QProcess не дает результата никак.

Автор: kwisp 21.2.2011, 9:55

Цитата(AndreyR @ 20.2.2011, 20:38) *
Получается только если запустить bash. Вызов sudo напрямую через QProcess не дает результата никак.

а если файл скрипта создать? можно даже из программы.
#!/bin/bash
echo 123456 | sudo -S fdisk -l /dev/sda 2>&1 ./fdisk.output

и его выполнить напрямую через QProcess
правда права на выполнение скрипта не знаю как выставить. но на этом форуме можно поискать.

ты ман sudo читал? там есть ещё ключ запускающий sudo в фоне. может пригодиться.
вообще надо почитать как именно выполняются процессы. может запуск в фоне или какой нить другой ключ предотвратят лишние действия такие как запуск ещё одной оболочки и проч....

П.С.
используй теги - это очень облегчает чтение.

Автор: Litkevich Yuriy 21.2.2011, 11:05

можно поискать исходник ksudo (вроде так называется) - оболочка KDE-шная для sudo

Автор: kwisp 21.2.2011, 11:50

Цитата(Litkevich Yuriy @ 21.2.2011, 11:05) *
можно поискать исходник ksudo (вроде так называется) - оболочка KDE-шная для sudo

или запускать sudo с ключом указывая путь к программе которая спрашивает пароль. askpass у меня она к емаксу прикручена чтоб с cvs по ssh работать
вариантов куча.
http://launchpad.net/kdesudo/

Автор: Kagami 21.2.2011, 13:01

А можно настроить sudo что бы он пароль не спрашивал...

Автор: kwisp 21.2.2011, 13:10

Цитата(Kagami @ 21.2.2011, 13:01) *
А можно настроить sudo что бы он пароль не спрашивал...

а как?

Автор: Disaron 23.2.2011, 22:04

Цитата(kwisp @ 21.2.2011, 13:10) *
Цитата(Kagami @ 21.2.2011, 13:01) *
А можно настроить sudo что бы он пароль не спрашивал...

а как?

Это конечно ужас и неправильно, но можно:
в /etc/sudoers
<имя_пользователя>    ALL=NOPASSWD: ALL


Автор: kwisp 23.2.2011, 23:17

Disaron,
а как при распространении программы быть?
на другой системе может не быть такой настройке.
задавая вопрос я это имел ввиду.

Автор: Rocky 24.2.2011, 8:58

Может тогда проще свой fdisk таскать?

Автор: kwisp 24.2.2011, 10:10

Цитата(Rocky @ 24.2.2011, 8:58) *
Может тогда проще свой fdisk таскать?

да не надо ничего таскать.
в этой ветке уже приведена куча решений.

Автор: Rocky 24.2.2011, 11:59

Да не, понятно что не надо. Я это к тому, что просто предпочтительней было бы ее таскать с собой, чем править sudoers. Или родному fdisk-у можно бит поставить специальный, чтоб ее выполнять мог любой. Короче да, куча решений.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)