我有一个Qt 4 GUI,我需要在下拉菜单中有一个选项,允许用户选择重新启动计算机。我意识到这可能看起来不太重要,能够以其他方式重新启动计算机,但选择需要留在那里。我尝试使用system()来调用以下内容:
所有这些都只会导致
reboot: must be superuser被打印出来。使用system()直接调用reboot会做同样的事情。我并不特别喜欢使用system()来做这件事,但它似乎是最直接的选择。
如何从GUI重启系统?
答案 0 :(得分:9)
Linux Programmer's Manual中描述了reboot
功能。在 glibc 下,您可以传递RB_AUTOBOOT
宏常量来执行重新启动。
请注意,如果reboot
之前未调用sync
,则数据可能会丢失。
在 Linux :
中使用 glibc#include <unistd.h>
#include <sys/reboot.h>
sync();
reboot(RB_AUTOBOOT);
答案 1 :(得分:7)
在Linux中:
#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc
sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);
答案 2 :(得分:4)
您是否尝试使用gksudo运行shell脚本?像
这样的东西gksudo shutdown -r
如果运气不错,那应该进行模态对话以获取用户凭据。
答案 3 :(得分:1)
suid-ing shell脚本正如前面提到的那样危险(这就是为什么它不起作用)。
我怀疑suid-ing二进制文件不起作用,因为系统使用用户的实际uid生成其子进程而不是suid,同样出于安全原因(它会让你用任何二进制文件替换被调用的二进制文件并运行)它作为根)。
您可以将重新启动的副本放在受保护的位置,以便只有您想要的用户才能执行它,然后suid-root THAT。
或者给予他们sudoer特权,执行JUST你关心的命令,并将系统输出到"ksh -c 'sudo reboot'"
答案 4 :(得分:0)
在二进制中尝试调用
setuid (0);
在系统()调用之前。
答案 5 :(得分:0)
如何从系统的命令行重启系统?
基本上做
system( <however you wouuld do it from the command line> );
答案 6 :(得分:0)
这应该几乎在任何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,系统应该顺利重启。通过GUI执行此操作的方式各不相同,例如,如果桌面环境是KDE,则与在Fluxbox下执行相同操作完全不同。