Ответ 1
В Linux:
#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc
sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);
У меня есть Qt 4 GUI, где мне нужно иметь опцию в раскрывающемся меню, которое позволяет пользователю выбрать перезагрузку компьютера. Я понимаю, что это может показаться излишним с возможностью перезагрузки компьютера другими способами, но выбор должен остаться там. Я попытался использовать system(), чтобы вызвать следующее:
и все они просто вызывают печать
reboot: must be superuser. Использование функции system() для прямой перезагрузки делает то же самое. Я не особенно привязан к использованию system() для этого, но это казалось самым прямым выбором.
Как перезагрузить систему из графического интерфейса?
В Linux:
#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc
sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);
Функция reboot
описана в Linux Programmer Manual. В разделе glibc вы можете передать константу макроса RB_AUTOBOOT
для выполнения перезагрузки.
Обратите внимание, что если reboot
не предшествует вызов sync
, данные могут быть потеряны.
Использование glibc в Linux:
#include <unistd.h>
#include <sys/reboot.h>
sync();
reboot(RB_AUTOBOOT);
Вы пытались запустить оболочку script, используя gksudo? Что-то вроде
gksudo shutdown -r
При любой удаче, это должно вывести модальный диалог, чтобы получить учетные данные пользователя.
suid-ing shell-скрипты просто опасны, как уже упоминалось (поэтому это не сработало).
Я подозреваю, что suid-in двоичный файл не работает, потому что система запускает свой подпроцесс с фактическим uid пользователя, а не с suid, опять же по соображениям безопасности (это позволит вам заменить любой двоичный код для вызываемого и запускаемого это как root).
Вы можете поместить копию перезагрузки в защищенное место, чтобы только пользователи, у которых вы хотите иметь разрешение, могли выполнить его, а затем suid-root THAT.
В качестве альтернативы дайте им привилегию sudoer для выполнения JUST команды, о которой вы заботитесь, и оставьте команду на что-то вроде "ksh -c 'sudo reboot'"
В двоичном файле попробуйте позвонить
setuid (0);
перед вызовом system().
как вы перезагрузите систему из командной строки в вашей системе?
в основном делают
system( <however you wouuld do it from the command line> );
Это должно быть сделано практически для любой 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.