我有一个Qt 4 GUI,我需要在下拉菜单中有一个选项,允许用户select重新启动计算机。 我意识到这可能似乎与其他方式重新启动计算机的能力,但select需要留在那里。 我已经尝试使用system()来调用以下内容:
所有这些都是正因为如此
重新启动:必须是超级用户
被打印。 使用system()来直接调用重启也是一样的。 我并不特别用system()来做到这一点,但它似乎是最直接的select。
我如何从GUI重新启动系统?
在Linux中:
#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc sync(); reboot(LINUX_REBOOT_CMD_POWER_OFF);
Linux程序员手册中描述了reboot
功能。 在glibc下 ,你可以传递RB_AUTOBOOT
宏常量来执行重启。
请注意,如果reboot
之前未进行sync
呼叫,则数据可能会丢失。
在Linux中使用glibc :
#include <unistd.h> #include <sys/reboot.h> sync(); reboot(RB_AUTOBOOT);
你有没有尝试运行一个shell脚本,使用gksudo? 就像是
gksudo shutdown -r
运气好的话,应该拉起一个模态对话来获取用户凭据。
suid-ing shell脚本就像刚才提到的那样是危险的(这就是为什么不起作用)。
我怀疑,suid的二进制不工作,因为系统用用户的实际uid而不是suid的子进程,出于安全原因(它可以让你替换任何二进制文件被调用,并作为根运行)。
你可以把一个重启的副本保护在一个位置,只有你想要的用户有权限才能执行它,然后suid-root这个。
或者给他们sudoer特权执行只是你关心的命令和系统出来的东西像"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
。 然后以任何用户的身份打电话重启,系统应该顺利重启。 通过GUI执行此操作的方式各不相同,例如,如果您的桌面环境是KDE,则与在Fluxbox下执行相同的操作完全不同。