subprocess.check_output忽略euid

时间:2017-11-02 03:15:01

标签: python subprocess python-3.5 setuid

我有以下bash脚本:

echo "$(id -u)"
mkdir test

我自己的用户ID是1000.现在,当我运行没有root权限的python3.5并通过subprocess.check_output调用脚本时,脚本按预期工作并创建一个由我拥有的文件夹。 但是,当我用sudo启动python但是然后使用os.setegid(1000); os.setuid(1000)时,脚本输出0和文件夹" test"由root拥有。虽然我得到echo "$(id -u)"可能是期望的行为,但我不明白为什么这个文件夹归root所有。 os.seteuid()函数不应该阻止吗?

我的确切电话是:

>>> os.setegid(1000)
>>> os.seteuid(1000)
>>> subprocess.check_output(["/.script.sh"])

这会导致文件夹" test"由root拥有。这是期望的行为,如果是这样,有什么方法可以作为普通用户启动脚本,同时仍然能够回到python脚本中的root权限(即,没有设置"真正的" uid? )

1 个答案:

答案 0 :(得分:1)

setegid仅设置current process的有效组ID。与seteuid相同。

check_output会生成一个新进程,但仍显然仍以root身份运行。 如果您尝试创建文件夹using python而不是外壳来执行此操作,您可能会有更多的运气,但我想这是一个简单的示例,因此可能不合适。是否可以将python脚本作为预期用户运行?如果不是,你可能需要做这样的事情;

subprocess.check_output(["sudo", "-uexpected_user", "./script.sh"])