我有一个以root用户身份运行的简单python脚本,但是将以其他用户身份执行子流程:
#!/usr/bin/env python2
import subprocess
import os
def demote(user_uid):
def result():
os.setuid(user_uid)
return result
cmd = "echo $USER"
proc = subprocess.Popen(cmd, preexec_fn=demote(1000), stdout=subprocess.PIPE, shell=True)
output = proc.communicate()[0]
print output
如果cmd为“ sleep 60”,则脚本以用户身份生成sleep:
# ps -ef | grep sleep
dave 17812 17811 0 17:05 pts/5 00:00:00 /usr/bin/sleep 60
但是,如果cmd为'echo $ USER',则输出为“ root”。如果我以其他用户的身份生成子流程,是否需要有人来获取用户的环境?
您实际上在这里对子流程没有任何问题。子进程正在从当前环境传递环境,因此,当您“ echo $ USER”时,它将报告当前环境中的用户。
查看将命令更改为时会发生什么,该命令whoami
实际上检查您的UID:
我的python shell以root身份运行:
>>> print os.getuid()
0
但是更改正在运行的命令将输出正确的新用户:
>>> cmd = "whoami"
>>> proc = subprocess.Popen(cmd, preexec_fn=demote(1000), stdout=subprocess.PIPE, shell=True)
>>> output = proc.communicate()[0]
>>> print output
voodoonofx
如果您确实想将环境修改为该用户,则可以将新字典传递给Popen调用。请参阅通过help(subprocess.Popen)传递的env关键字:
__init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
Create new Popen instance.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句