我正在制作一个c程序来关闭Ubuntu,而无需使用following link进行系统调用。
code.c
#include <unistd.h>
#include <sys/reboot.h>
int main() {
reboot(RB_POWER_OFF);
}
gcc code.c -o out.exe
在这里,如果我以root用户身份运行此可执行文件(out.exe),则只有它会关闭系统,而如果我在普通用户模式下运行相同的文件,它将无法正常工作。为了在普通用户模式下运行此代码,我必须对代码进行哪些更改?
答案 0 :(得分:3)
出于多种原因,最好使用例如以下方法关闭机器电源
execl("/bin/shutdown", "shutdown", "-P", "now", (char *)0);
或使用
重启execl("/bin/shutdown", "shutdown", "-r", "now", (char *)0);
根本没有外壳。 shutdown
系统管理命令代替了当前进程,如果允许正在运行该进程的用户关闭或重新启动计算机,则该命令已经具有必要的特权。
(也就是说,上面的语句之后的代码根本不会执行,除非缺少系统实用程序。它会出现在任何正常运行的系统上,甚至是嵌入式系统上。)
您甚至可以将"now"
替换为"+1m"
之类的固定字符串,以在一分钟后关闭或重新启动。 (在此期间,其他所有内容将继续正常运行。在此期间仅使用shutdown
参数运行-c
将会取消挂起的关机/重新启动。)
如果您是通过GUI应用程序执行此操作的,则只能在普通程序从return
到main()
或exit()
的情况下执行。
这些原因是什么?
简单,健壮,最小惊喜的原则,适当的关机/重新引导特权管理,不需要特殊特权,因此减少了威胁面(程序中的错误很少授予特殊特权,因为没有)。对于初学者。
答案 1 :(得分:0)
如果代码以非root用户身份运行,则没有重新启动系统的权限。
最简单的方法是将可执行的set-uid设置为root:
sudo chown root:root out.exe
sudo chmod 4755 out.exe
然后任何用户都可以运行它,它将以root权限运行。