Подтвердить что ты не робот

Как перезапустить Linux изнутри программы на С++?

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

  • оболочка suid-root script
  • некорректная оболочка script
  • двоичная программа suid-root

и все они просто вызывают печать

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

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

4b9b3361

Ответ 1

В Linux:

#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc   

sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);

Ответ 2

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

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

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

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

sync();
reboot(RB_AUTOBOOT);

Ответ 3

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

gksudo shutdown -r

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

Ответ 4

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

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

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

В качестве альтернативы дайте им привилегию sudoer для выполнения JUST команды, о которой вы заботитесь, и оставьте команду на что-то вроде "ksh -c 'sudo reboot'"

Ответ 5

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

setuid (0);

перед вызовом system().

Ответ 6

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

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

system( <however you wouuld do it from the command line> );

Ответ 7

Это должно быть сделано практически для любой 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 в двоичном формате. Затем вызовите reboot как любой пользователь, и система должна перезагрузиться плавно. То, как вы это делаете с помощью графического интерфейса, зависит от того, как, например, для вашей рабочей среды KDE, это совсем не так, как при использовании Fluxbox.