如何在 C 中使用 linux 重启功能来关闭 Linux(Ubuntu)系统?

Posted

技术标签:

【中文标题】如何在 C 中使用 linux 重启功能来关闭 Linux(Ubuntu)系统?【英文标题】:how to use linux reboot function in C for shutdown Linux(Ubuntu) system? 【发布时间】:2018-11-29 03:06:06 【问题描述】:

我正在使用 following link 编写一个 c 程序来关闭 Ubuntu 而无需系统调用。

code.c
#include <unistd.h>
#include <sys/reboot.h>
int main() 
reboot(RB_POWER_OFF);

gcc code.c -o out.exe

如果我以root用户身份运行这个可执行文件(out.exe),那么只有它会关闭系统,如果我在普通用户模式下运行相同的文件,它就不起作用。所以为了在正常用户模式下运行此代码,我必须对代码进行哪些更改?

【问题讨论】:

您的进程以运行它们的用户的权限运行。你可以sudo ./run_your_program 你为什么要为 linux 创建一个 exe?并尝试sudo 命令。 【参考方案1】:

由于很多原因,最好使用例如关闭机器电源

execl("/bin/shutdown", "shutdown", "-P", "now", (char *)0);

或使用重新启动

execl("/bin/shutdown", "shutdown", "-r", "now", (char *)0);

根本不涉及外壳。当前进程被shutdown系统管理命令替换,如果允许该进程运行的用户关闭或重启机器,则该命令已经拥有必要的权限。

(也就是说,上面语句后面的代码根本不会执行,除非系统实用程序丢失。它会在任何正常运行的系统上存在,甚至是嵌入式系统。)

您甚至可以将"now" 替换为"+1m" 之类的固定字符串,以在一分钟后关闭或重新启动。 (在此期间,其他一切将继续正常运行。在此期间仅使用-c 参数运行shutdown 将取消挂起的关机/重启。)

如果您从 GUI 应用程序执行此操作,请仅在普通程序从 main()exit()exit() 执行此操作时执行。


这些原因是什么?

简单、稳健、最少意外原则、正确管理关机/重启权限、不需要特殊权限并因此减少威胁面(程序中的错误不太可能授予特殊权限,因为没有)。对于初学者。

【讨论】:

@raj123:是的。这里唯一的风险是攻击者能够远程关闭系统,通过利用应用程序中其他地方的一些错误或安全漏洞(导致该行代码意外运行)——假设你的应用程序通过网络进行通信,或者这些机器具有可以执行您的应用程序的不受信任的用户。为了避免这种风险,您只需要清理/检查输入,并考虑它允许不受信任的用户做什么。【参考方案2】:

如果代码以非root用户身份运行,则无权重启系统。

最简单的做法是将可执行的 set-uid 设为 root:

sudo chown root:root out.exe
sudo chmod 4755 out.exe

然后任何用户都可以运行它,它会以root权限运行。

【讨论】:

但见Exploiting SUID Executables C 文件 API 被另一个文件调用,所以我必须在 C 函数 NOT EXECUTABLE BINARY FILE 中设置 root 权限。 @dbush

以上是关于如何在 C 中使用 linux 重启功能来关闭 Linux(Ubuntu)系统?的主要内容,如果未能解决你的问题,请参考以下文章

如何重新启动linux里的X服务器

linux怎么关闭

为啥使用非标准 C(gcc 特定功能)对 linux 内核进行编码? [关闭]

如何用C语言来编写让系统中某个服务停止或重启?

如何在Linux操作系统定时重启Tomcat服务

linux 服务器 需要重新启动吗