使程序始终以 root 身份在 OS X 中运行

yar*_*oze 4 unix permissions chmod macos

我试图让 C 程序始终以 root 身份运行,无论是谁调用它。基本上,我希望它以调用“mkdir /test”为例。所以我创建了 C 程序如下:

#include <stdio.h>

int main()
{
system("mkdir /test");
printf("bye...\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我刚刚编译它:gcc test.c -o test

现在我尝试设置权限:

chmod +s test
Run Code Online (Sandbox Code Playgroud)

但是,以普通用户身份运行它时,出现权限被拒绝错误。因此,它执行文件但不具有 root 权限。我还尝试将权限设置为:

chmod a+s test
chmod o+s test
Run Code Online (Sandbox Code Playgroud)

但我总是遇到同样的问题。

任何人都可以帮助我吗?顺便说一下,文件 test.c 是由 root 创建的,它也被编译为 root。

bash-3.2# ls -al | grep test 
-rwxr-xr-x   1 root   staff       8796  5 Ago 19:07 test
bash-3.2# chmod +s test
bash-3.2# ls -al | grep test 
-rwsr-sr-x   1 root   staff       8796  5 Ago 19:07 test
bash-3.2# whoami
root
bash-3.2#
Run Code Online (Sandbox Code Playgroud)

提前致谢!干杯!

slh*_*hck 11

这里有两件事需要了解:

  • 粘滞位,这可能对文件和目录可以使用,但你想要什么也不会做。来自sticky(8)粘滞位对可执行文件没有影响

  • setuid允许程序以其所有者权限运行的标志。似乎是 OS X 中的一个限制,显然没有记录,是可执行文件上的 setuid 位只有在可执行文件位于 root 拥有的目录中时才有效(并且不开放供其他人写入),等等,直到根目录。否则,出于安全原因,它会被忽略。

无论如何,您可以修改 sudoers 文件,这样一个命令就不需要密码。请记住,您必须使用visudo来编辑它。如果您在编辑文件时设法弄错了语法,您将根本无法运行sudo

sudo visudo
Run Code Online (Sandbox Code Playgroud)

然后,按I,并在底部插入:

username    ALL= NOPASSWD: /path/to/command
Run Code Online (Sandbox Code Playgroud)

在这里,您显然需要更改username应该运行命令而无需输入密码的用户。此外,更改可执行文件的路径。请注意,此时,可执行文件只能由其拥有root并具有执行权限root

Esc,然后写:wq,然后Enter

现在,用户username可以运行命令sudo /path/to/command并且不需要输入密码来执行此操作。

  • 在 OS X 上 setuid 位不会被忽略,你怎么认为像你提到的 sudo 这样的程序如果不是因为它是 setuid root 的,它如何能够工作?似乎是 OS X 中的一个限制,显然没有记录,是可执行文件上的 setuid 位只有在可执行文件位于 root 拥有的目录中时才有效(并且不开放供其他人写入),等等,直到根目录。 (4认同)