如何从C ++程序中重启Linux?

时间:2010-04-20 21:25:36

标签: c++ linux qt4 reboot suid

我有一个Qt 4 GUI,我需要在下拉菜单中有一个选项,允许用户选择重新启动计算机。我意识到这可能看起来不太重要,能够以其他方式重新启动计算机,但选择需要留在那里。我尝试使用system()来调用以下内容:

  1. suid-root shell脚本
  2. 非suid shell脚本
  3. suid-root二进制程序
  4. 所有这些都只会导致

    reboot: must be superuser
    被打印出来。使用system()直接调用reboot会做同样的事情。我并不特别喜欢使用system()来做这件事,但它似乎是最直接的选择。

    如何从GUI重启系统?

7 个答案:

答案 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下执行相同操作完全不同。