我想创建一个简单的脚本来重新启动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
目录下。我在网上读到Mac只允许所有者根的setuid位,当所有的目录直到/
是由根拥有。所以,我把我的可执行文件移到了这个目录下。
-rwsr-xr-x 1 root wheel 33016 Apr 2 08:50 somethingsdfsdf
但是,可执行文件的输出是,
$ ./somethingsdfsdf
501
501
Password:
hello
可以看到,它不是根用户id,而是我的。有人知道我错过了什么吗?
在macOS上,可执行文件上的setuid
位只有当可执行文件位于root所有的目录(并且不允许其他人打开以写入)时才有效。层次结构中的所有目录也必须为root所有。否则,出于安全考虑,将忽略它。
提升权限的最佳方法可能取决于您打算如何使用和执行此脚本。例如,如果它是一个计划任务,您可以使用启动守护进程。