使用“subprocess.call()”时改变真实有效的用户

时间:2015-09-14 19:39:21

标签: python

先决条件:

  • python2.6的
  • GNU Linux

我对'subprocess.call'行为和保护http服务器有一些疑问。

以下代码示例的不同之处在于不使用/使用shell:

1

sudo python -c "from subprocess import call; from os import setreuid, setregid; setreuid(1000,0); setregid(1000,0); call(['touch','./aaa'])"

生成'root'拥有的文件。

2

sudo python -c "from subprocess import call; from os import setreuid, setregid; setreuid(1000,0); setregid(1000,0); call('touch ./aaa', shell=True)"

生成用户1000拥有的文件。

的问题:

在第一种情况下生成有效用户拥有的文件和在第二种情况下生成真实用户的文件是什么原因?

在python2.6(没有'setresuid')中是否有办法临时(并安全地)在python代码中更改用户?

使用特权有效用户进行临时实际用户更改以提高/降低权限是否安全?

2 个答案:

答案 0 :(得分:1)

这可能发生在/bin/shbash时,因为bash将有效用户ID设置为真实用户ID,除非在启动时提供了-p选项。

documentation

中对此进行了描述
  

如果Bash以有效用户(组)id不等于真实用户(组)id启动,并且未提供-p选项,则不会读取任何启动文件,shell函数不会从环境继承, SHELLOPTS,BASHOPTS,CDPATH和GLOBIGNORE变量(如果它们出现在环境中)将被忽略,并且有效用户ID将设置为真实用户ID。如果在调用时提供了-p选项,则启动行为相同,但不会重置有效用户ID。

答案 1 :(得分:0)

你可以使用sudo:

sudo python -c "from subprocess import call; call('sudo -u unprivileged_user touch ./aaa', shell=True)"