该setuid权限位告诉Linux与业主,而不是执行者的有效用户ID运行程序:
> cat setuid-test.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
printf("%d", geteuid());
return 0;
}
> gcc -o setuid-test setuid-test.c
> ./setuid-test
1000
> sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
> ./setuid-test
65534
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于可执行文件;shell 脚本忽略 setuid 位:
> cat setuid-test2
#!/bin/bash
id -u
> ./setuid-test2
1000
> sudo chown nobody ./setuid-test2; sudo chmod +s ./setuid-test2
> ./setuid-test2
1000
Run Code Online (Sandbox Code Playgroud)
维基百科说:
由于安全漏洞的可能性增加,许多操作系统在应用于可执行 shell 脚本时会忽略 setuid 属性。
假设我愿意接受这些风险,有没有办法告诉 Linux 将 shell 脚本上的 setuid …
我想确保我的程序只能由xyz使用 root 权限的用户运行。为此,我设置了 setuid 位:
chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh
Run Code Online (Sandbox Code Playgroud)
此外,我将用户添加xyz到house组中,以便只有xyzroot 用户可以运行 program1.sh。
在 program1.sh 中有
id -u
Run Code Online (Sandbox Code Playgroud)
以便它可以向我显示有效 ID。
program1.sh以 root 身份运行,它显示root. 但是使用该xyz帐户运行时,它显示xyz. 似乎它没有以 root 权限运行。我不知道这里出了什么问题。