我想创建一个简单的脚本来重启 Mac。该命令需要 root 权限,所以我决定创建一个设置了 setuid 位且所有者为 root 的可执行文件。
为了测试 setuid 行为,C 文件:
#include<stdio.h>
#include<stdlib.h>
int main() {
system("echo $UID");
system("echo $EUID");
system("sudo echo hello");
}
我已将可执行文件放在
/usr/local/bin
目录中。我在互联网上的某个地方读到,当 /
之前的所有目录都由 root 拥有时,Mac 只允许所有者 root 的 setuid 位。所以,我将我的可执行文件移到了这个目录中。
-rwsr-xr-x 1 root wheel 33016 Apr 2 08:50 somethingsdfsdf
但是,可执行文件的输出是,
$ ./somethingsdfsdf
501
501
Password:
hello
如你所见,这不是root用户id,而是我的。有人知道我错过了什么吗?
在 macOS 上,可执行文件上的
setuid
位仅当可执行文件位于 root 拥有的目录中(并且未打开供其他人写入)时才有效。层次结构中的所有目录也必须由 root 拥有。否则,出于安全原因,它会被忽略。
提升权限的最佳方法可能取决于您打算如何使用和执行此脚本。例如,如果它是一个计划任务,你可以使用启动守护进程。