【发布时间】:2016-01-17 08:58:21
【问题描述】:
一些实验似乎 setresuid / setresgid 在 C 和 Python 中的工作方式不同,我不太清楚为什么。如果我有以下简短的 C 程序:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
setresuid(999, 999, 999);
setresgid(999, 999, 999);
system("/some/program");
return 0;
}
并且该二进制文件设置了 setuid 位,并且该二进制文件位于组 999 和所有者 999 中,以另一个用户身份运行此二进制文件将以用户 999 身份运行 /some/program,这是您所期望的,因为我相信背后的想法setuid 位是允许程序以文件的组/所有者权限运行。
另一方面,如果我有以下简短的 Python 程序:
#!/usr/bin/python
import os
import subprocess
os.setresuid(999,999,999)
subprocess.check_output('/some/program', shell=True)
并且 python 脚本设置了 setuid 位,位于组 999 中并由用户 999 拥有,以另一个用户身份运行脚本会出现错误:
Traceback (most recent call last):
File "/foo/bar/sample.py", line 5, in <module>
os.setresuid(999,999,999)
OSError: [Errno 1] Operation not permitted
知道为什么会这样吗?
【问题讨论】:
-
是的,Python 脚本也设置了 setuid 位。我更新了我的描述。
-
我的猜测是 Python 运行时抱怨无效操作,而 C 系统调用只返回 -1。可以打印
setresuid()的返回值吗? -
你可能更喜欢问这样的问题:“我怎样才能像
setuid一个已编译的二进制文件那样向 python 程序授予系统权限?”因为现在您的问题已得到解答,但您可能仍有问题需要解决。