17

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

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

他们都只是因为

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

如何从 GUI 重新启动系统?

4

7 回答 7

15

Linux Programmer's Manualreboot中描述了该功能。在glibc下,您可以传递宏常量来执行重启。RB_AUTOBOOT

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

Linux中使用glibc

#include <unistd.h>
#include <sys/reboot.h>

sync();
reboot(RB_AUTOBOOT);
于 2013-09-12T14:15:06.320 回答
8

在 Linux 中:

#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc   

sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);
于 2011-01-30T11:31:30.040 回答
4

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

gksudo shutdown -r

运气好的话,应该会启动一个模态对话来获取用户凭据。

于 2010-04-20T21:35:25.073 回答
1

正如已经提到的那样,suid-ing shell 脚本很危险(这就是为什么它不起作用)。

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

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

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

于 2010-04-21T15:56:15.390 回答
1

这应该在几乎任何 linux 系统上执行。

#include <unistd.h>
#include <sys/reboot.h>

int main () {
  sync();
  setuid(0);
  reboot(RB_AUTOBOOT);
  return(0);
}

然后只需编译gcc reboot.c -o rebootchmod a+s reboot在二进制文件上执行。然后以任何用户的身份调用 reboot ,系统应该会顺利重启。通过 GUI 执行此操作的方式各不相同,例如,如果您的桌面环境是 KDE,它与在 Fluxbox 下执行相同操作完全不同。

于 2017-10-08T04:21:55.257 回答
0

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

基本上做

system( <however you wouuld do it from the command line> );
于 2010-04-21T15:25:19.890 回答
0

在二进制中尝试调用

setuid (0);

在 system() 调用之前。

于 2010-04-20T21:41:28.497 回答