Как перезапустить Linux из программы на C ++? - PullRequest
13 голосов
/ 21 апреля 2010

У меня есть графический интерфейс Qt 4, где мне нужно, чтобы в раскрывающемся меню была опция, позволяющая пользователю выбрать перезагрузку компьютера. Я понимаю, что это может показаться избыточным с возможностью перезагрузки компьютера другими способами, но выбор должен остаться там. Я пытался использовать system () для вызова следующего:

  1. скрипт оболочки suid-root
  2. скрипт не-suid
  3. бинарная программа suid-root

и все они просто приводят к печати

reboot: must be superuser
. Использование system () для непосредственного вызова reboot делает то же самое. Я не особо привязан к использованию system () для этого, но это был самый прямой выбор.

Как я могу перезагрузить систему из графического интерфейса?

Ответы [ 7 ]

9 голосов
/ 12 сентября 2013

Функция reboot описана в Руководстве программиста Linux . В glibc вы можете передать макрос-константу RB_AUTOBOOT для перезагрузки.

Обратите внимание, что если reboot не предшествует вызов sync, данные могут быть потеряны.

Использование glibc в Linux :

#include <unistd.h>
#include <sys/reboot.h>

sync();
reboot(RB_AUTOBOOT);
7 голосов
/ 30 января 2011

В Linux:

#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc   

sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);
4 голосов
/ 21 апреля 2010

Вы пробовали запустить скрипт оболочки, используя gksudo? Что-то вроде

gksudo shutdown -r

Если повезет, это вызовет модальный диалог, чтобы получить учетные данные пользователя.

1 голос
/ 21 апреля 2010

Сценарии оболочки suid-ing просто опасны, как уже упоминалось (вот почему это не сработало).

Я подозреваю, что сопоставление двоичного файла не работает, потому что система порождает свой подпроцесс с действительным uid пользователя, а не с suid, опять же из соображений безопасности (это позволит вам заменить любой двоичный файл вызываемым и запустить это как корень).

Вы можете поместить копию перезагрузки в защищенное место, чтобы ее могли выполнять только те пользователи, которым вы хотите, а затем suid-root THAT.

Поочередно предоставьте им привилегию sudoer для выполнения ТОЛЬКО команды, о которой вы заботитесь, и система выдаст что-то вроде "ksh -c 'sudo reboot'"

0 голосов
/ 08 октября 2017

Это должно быть сделано практически на любой Linux-системе.

#include <unistd.h>
#include <sys/reboot.h>

int main () {
  sync();
  setuid(0);
  reboot(RB_AUTOBOOT);
  return(0);
}

Затем просто скомпилируйте с gcc reboot.c -o reboot и выполните chmod a+s reboot в двоичном файле. Затем вызовите перезагрузку, как любой пользователь, и система должна перезагрузиться. То, как вы делаете это через графический интерфейс, меняется, например, если в вашей среде рабочего стола был KDE, то это совсем не то же самое, что делать в Fluxbox.

0 голосов
/ 21 апреля 2010

как бы вы перезагрузили систему из командной строки в вашей системе?

в основном делают

system( <however you wouuld do it from the command line> );
0 голосов
/ 21 апреля 2010

В двоичном коде попробуйте позвонить

setuid (0);

перед вызовом системы ().

...