我有这个以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”,则脚本会以用户身份生成睡眠:
# ps -ef | grep sleep
dave 17812 17811 0 17:05 pts/5 00:00:00 /usr/bin/sleep 60
但是,如果cmd是'echo $ USER',则outout是“root”。如果我将子进程作为另一个用户生成,是否需要有人来获取用户的env?
答案 0 :(得分:1)
这里的子进程实际上没有问题。子进程从当前环境传递到环境中,因此当您“回显$ 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传递的env关键字(subprocess.Popen):
__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.
答案 1 :(得分:0)
在运行任何命令之前更改用户,这可能会有所帮助:
su otheruser # this will prompt you to enter the 'otheruser' password.
答案 2 :(得分:0)
一种选择是运行完整的登录shell ...例如
cmd = "/bin/bash -l -c 'echo $USER'"