Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как выполнить команду через sudo
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
AndreyR
Здравствуйте. Возникла необходимость выполнить в программе на 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
Цитата(AndreyR @ 18.2.2011, 21:46) *
не получается передать sudo пароль
лучше, ждать отклика приложения (sudo), т.е. ловить то что оно печатает. Наверняка оно печатает, что-то типа:
"enter password:"
и только потом ожидает пароля
kwisp
AndreyR,
в ман по sudo загляни - там есть ключик -S
так вот с ним sudo считывает пароль со стандартного ввода
тебе надо сделать примерно так
echo "твой пароль" | sudo -S fdisk -l /dev/sda
AndreyR
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
Цитата(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
можно поискать исходник ksudo (вроде так называется) - оболочка KDE-шная для sudo
kwisp
Цитата(Litkevich Yuriy @ 21.2.2011, 11:05) *
можно поискать исходник ksudo (вроде так называется) - оболочка KDE-шная для sudo

или запускать sudo с ключом указывая путь к программе которая спрашивает пароль. askpass у меня она к емаксу прикручена чтоб с cvs по ssh работать
вариантов куча.
Домашняя страница kde-misc/kdesudo
Kagami
А можно настроить sudo что бы он пароль не спрашивал...
kwisp
Цитата(Kagami @ 21.2.2011, 13:01) *
А можно настроить sudo что бы он пароль не спрашивал...

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

а как?

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

kwisp
Disaron,
а как при распространении программы быть?
на другой системе может не быть такой настройке.
задавая вопрос я это имел ввиду.
Rocky
Может тогда проще свой fdisk таскать?
kwisp
Цитата(Rocky @ 24.2.2011, 8:58) *
Может тогда проще свой fdisk таскать?

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