我正在尝试创建一个可以以用户身份运行的关机命令,即 ic,一个不以 root 身份运行的烧瓶网页。听起来很简单,只需shutdown
在 SETUID 脚本中输入一个命令即可。因为 SETUID 不适用于 shell 脚本,所以我从 C 程序创建了一个可执行文件。
问题是这在目标机器上不起作用,一个 Raspberry Pi Zero W。我在我的 Ubuntu 20.4 电脑上测试了相同的东西,它运行完美。所以该方法本身似乎是正确的,但存在树莓派问题。
Pi 运行这个操作系统:
cat /etc/issue
-->
Raspbian GNU/Linux 10 \n \l
这是 usershutdown.c :
#include <stdio.h>
#include <stdlib.h>
int main(){
system("/sbin/poweroff");
}
这些是可执行文件的权限:
-rwsr-xr-x 1 root root 7988 Dec 20 23:59 usershutdown
我在 /etc/fstab 中检查了根磁盘的挂载选项,并在其中添加,suid
并重新启动:
PARTUUID=738a4d67-02 / ext4 defaults,noatime,suid 0 1
这些是按预期调用 exec 时 Pi 上的错误消息:
$ ./usershutdown
Failed to set wall message, ignoring: Interactive authentication required.
Failed to power off system via logind: Interactive authentication required.
Failed to open initctl fifo: Permission denied
Failed to talk to init daemon.
$
这就是在 Pi 上起作用的方法,当以 root/sudo 调用 exec 时,与它的 ssh 连接将关闭,并且设备会在没有错误的情况下关闭:
$ sudo ./usershutdown
$ Connection to picamhq closed by remote host.
Connection to picamhq closed.
$
我该如何解决?