我想确保我的程序只能由xyz
使用 root 权限的用户运行。为此,我设置了 setuid 位:
chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh
另外,我将用户添加xyz
到house
组中,以便只有xyz
root 可以运行program1.sh。
在program1.sh中有
id -u
这样它就可以显示有效的ID。
以 root身份运行program1.sh
,显示root
.但运行该xyz
帐户,它显示xyz
。看来它没有以 root 权限运行。我不知道这里出了什么问题。
答案1
执行具有 setuid 位的 shell 脚本(例如权限为 rwsr-xr-x)时,脚本以执行它们的用户身份运行,而不是以拥有它们的用户身份运行。这与 setuid 对二进制文件(例如 /usr/bin/passwd)的处理方式相反,二进制文件以拥有它们的用户身份运行,无论哪个用户执行它们。
检查此页面:https://access.redhat.com/site/solutions/124693这是操作系统采取的安全措施。你应该使用你的脚本须藤反而。
如果您确实需要在脚本中使用 setuid,您可以创建一个可执行该工作的二进制文件。创建一个新文件“program.c”并复制以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0);
system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
return 0;
}
使用以下命令编译并执行代码:
$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program
这样就可以了。 setuid适用于编译后的文件,该文件可以以root身份执行其他文件。