【问题标题】:How to restart Linux from inside a C++ program?如何从 C++ 程序内部重新启动 Linux?
【发布时间】:2023-03-30 00:11:01
【问题描述】:

我有一个 Qt 4 GUI,我需要在下拉菜单中有一个选项,允许用户选择重新启动计算机。我意识到这似乎与以其他方式重新启动计算机的能力无关,但选择需要留在那里。我尝试使用 system() 调用以下内容:

  1. suid-root shell 脚本
  2. 一个非 suid 的 shell 脚本
  3. suid-root 二进制程序

所有这些都只是导致

reboot: 必须是超级用户
才能打印。使用 system() 直接调用 reboot 做同样的事情。我并不特别喜欢使用 system() 来做到这一点,但这似乎是最直接的选择。

如何从 GUI 重新启动系统?

【问题讨论】:

标签: c++ linux qt4 reboot suid


【解决方案1】:

这应该在几乎任何 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 下执行相同操作完全不同。

【讨论】:

    【解决方案2】:

    reboot 函数在Linux Programmer's Manual 中描述。在 glibc 下,您可以传递 RB_AUTOBOOT 宏常量来执行重启。

    请注意,如果reboot 之前没有调用sync,数据可能会丢失。

    Linux 中使用 glibc

    #include <unistd.h>
    #include <sys/reboot.h>
    
    sync();
    reboot(RB_AUTOBOOT);
    

    【讨论】:

      【解决方案3】:

      在 Linux 中:

      #define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc   
      
      sync();
      reboot(LINUX_REBOOT_CMD_POWER_OFF);
      

      【讨论】:

      • 如果您使用的是 glibc 版本,#include 应该包含在上面的代码中...如果是这样,只需在该头文件中使用#define RB_POWER_OFF。 ..
      【解决方案4】:

      如前所述,使用 shell 脚本很危险(这就是为什么它不起作用)。

      我怀疑 suid-ing 二进制文件不起作用,因为系统使用用户的实际 uid 而不是 suid 生成其子进程,再次出于安全原因(它可以让您用任何二进制文件替换被调用并运行的那个)它作为根)。

      您可以将 reboot 的副本放在受保护的位置,这样只有您希望有权执行它的用户才能执行它,然后 suid-root 那个。

      或者给他们 sudoer 特权来执行你关心的命令和系统输出类似"ksh -c 'sudo reboot'"

      【讨论】:

        【解决方案5】:

        您将如何从系统上的命令行重新启动系统?

        基本上是这样的

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

        【讨论】:

        • 感谢您的建议,但这是我们尝试过的,但它不起作用。
        【解决方案6】:

        在二进制中尝试调用

        setuid (0);
        

        在 system() 调用之前。

        【讨论】:

        • 感谢您的建议,但是当从另一个程序调用该程序时,这不起作用。但是,如果直接从命令行调用程序,它确实可以工作。
        【解决方案7】:

        您是否尝试过使用 gksudo 运行 shell 脚本?像

        gksudo shutdown -r
        

        如果运气好的话,应该会弹出一个模式对话框来获取用户凭据。

        【讨论】:

        • 好吧,你真的不需要将它作为 shell 脚本运行,只需 execv 它,或者如果你真的想要 shell 脚本附带的 PATH 功能,execvp
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2014-07-28
        相关资源
        最近更新 更多