Russian Qt Forum

Компиляторы и платформы => Linux => Тема начата: Vladimir от Ноябрь 20, 2012, 15:13



Название: [РЕШЕНО] Программно выключить компьютер под пользователем в Linux
Отправлено: Vladimir от Ноябрь 20, 2012, 15:13
Доброго дня! Собственно вопрос как это сделать программно (НЕ ИЗ-ПОД ROOT)?
Linux OpenSuse 11.4
Из консоли выключает так:
Код:
su root
Пароль: ***
shutdown -h now

Возможно ли сделать программно выключение компьютера без ввода пароля пользователя, взять его как-либо из системы, либо ввести его вручную в интерфейсе настроек программы, скажем, и подставить его КАК-ТО при запросе пароля командной su..


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: kuzulis от Ноябрь 20, 2012, 15:19
Добавить пользователя в группу power не? (в слуае если дистрибутив еще без systemd).

А так - поиск в гугле рулит!


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Fat-Zer от Ноябрь 20, 2012, 15:33
можно sudo настроить на выполнение некоторых команд без пароля...


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Vladimir от Ноябрь 20, 2012, 16:01
Добавить пользователя в группу power не? (в слуае если дистрибутив еще без systemd).

А так - поиск в гугле рулит!

не знаю, что такое systemd, но группы power нет!
Пробую писать при отладке
Код:
system("su root")
в дебаге вылазит слово "Пароль:", которые не понятно как ввести..
Если вводить  system("sudo shutdown -h now"), то на консоль выводит "no tty present and no askpass program specified"..


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Vladimir от Ноябрь 20, 2012, 16:02
можно sudo настроить на выполнение некоторых команд без пароля...

А как это сделать в моем случае с выключением компьютера не подскажите?


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Alex Custov от Ноябрь 20, 2012, 21:27
Посмотри на xdg-su. Этой команды может не быть в некоторых дистрибутивах, так что распространять придётся вместе с программой.


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: shame от Ноябрь 21, 2012, 10:43
Не мелите чушь. Все это делается через QDbus


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Fat-Zer от Ноябрь 21, 2012, 11:55
А как это сделать в моем случае с выключением компьютера не подскажите?
если кратко, то добавить строчку в /etc/sudoers
ALL ALL = NOPASSWD: (ALL) /sbin/shutdown
перед этим хорошобы прочитать man 5 sudoers и понять, что оно означает, поставить конкретную группу или юзера итп...

но опять же если надо из программы сделать и на десктопе, а не из шела, то лучше череш dbus послать сигнал кому-надо


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Alex Custov от Ноябрь 21, 2012, 14:12
Не мелите чушь. Все это делается через QDbus

например?


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: shame от Ноябрь 21, 2012, 19:03
например?

org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Alex Custov от Ноябрь 21, 2012, 19:23
org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

для этого требуется HAL, от которого сейчас отказываются. У меня его нет, например. Причём ставить его только для возможности выключения - явно перебор.


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Igors от Ноябрь 21, 2012, 19:42
Владимир, а может надо "гибче"? Ответы показали что такой простой, очевидной возможности нету. А о кросс-платформенности здесь лучше не вспоминать. Это тоже полезно, значит надо перепланировать задачу и обойтись без этого. Ну да, хотелось бы, но ничего не попишешь. А "упираться рогом" здесь бесперспективно
Цитировать
Не за то отец бил что играл, а за то что отыгрывался


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: shame от Ноябрь 21, 2012, 21:25
для этого требуется HAL, от которого сейчас отказываются. У меня его нет, например. Причём ставить его только для возможности выключения - явно перебор.

я просто привел пример  ::)

вот еще org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

для гнома org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown

для кед org.kde.ksmserver /KSMServer logout 0 2 2


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Vladimir от Ноябрь 21, 2012, 21:46
Владимир, а может надо "гибче"? Ответы показали что такой простой, очевидной возможности нету. А о кросс-платформенности здесь лучше не вспоминать. Это тоже полезно, значит надо перепланировать задачу и обойтись без этого. Ну да, хотелось бы, но ничего не попишешь. А "упираться рогом" здесь бесперспективно
Цитировать
Не за то отец бил что играл, а за то что отыгрывался


ну что касается кросс-платформенности, то думаю развезать под win и linux проблемы не составит (Q_OS_WIN - Q_OS_LINUX) и для каждой платформы написать свой код.. не под все дистрибутивы linux вариант с QDbus пойдет? пока планируется использовать программу только под OpenSUSE, надо попробовать, тем более раньше никогда не работал с QDbus.. а "перепланировать задачу" сложно будет, ибо такая возможность в программе должна быть железно!


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Vladimir от Ноябрь 21, 2012, 21:47
спасибо за ответы! буду пробовать..


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Igors от Ноябрь 21, 2012, 22:10
ибо такая возможность в программе должна быть железно!
Жизнь покажет  :)


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: shame от Ноябрь 21, 2012, 22:28
Ну в любом случае не стоит колупать систему ради программы, если только вы не будете ее использовать только у себя  ;)


Название: Re: Программно выключить компьютер под пользователем в Linux
Отправлено: Vladimir от Ноябрь 20, 2014, 14:36
Давно не смотрел эту ветку, а тема, как оказывается, была активно просматриваемая. Ответ тогда нашелся через QDBus, может кому пригодится!

Код:
.pro
CONFIG += qdbus
...
#include <QtDBus/QtDBus>

QDBusInterface iface("org.freedesktop.ConsoleKit",
                             "/org/freedesktop/ConsoleKit/Manager",
                             "org.freedesktop.ConsoleKit.Manager",
                             QDBusConnection::systemBus());

            if(iface.isValid())
            {
                QDBusReply<QString> reply = iface.call("Stop");
                if(reply.isValid()) {
                    printf("Reply was: %s\n", qPrintable(reply.value()));
                }

                fprintf(stderr, "Call failed: %s\n", qPrintable(reply.error().message()));
            }
            else
            {
                qDebug() << "QDBusInterface not valid";
            }