如何在 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)系统?的主要内容,如果未能解决你的问题,请参考以下文章