Версия для печати темы
Форум на 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, но как-то это мудрено, опять таки зависимость от оконной среды, не хочется прибегать к таким мутным вариантам.
О
Не в тот раздел попал, перенесите пожалуйста
Автор: 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)