python - 作为另一个用户使用 python 子进程时环境错误

标签 python environment-variables subprocess setuid

我有这个简单的 python 脚本,它以 root 身份运行,但会以其他用户身份执行子进程:

#!/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.

关于python - 作为另一个用户使用 python 子进程时环境错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19599461/

相关文章:

Python:子进程调用无法识别 * 通配符?

python - 在 R 传单 map 上叠加图像

python - 在 Jupyter 中,如何默认使用 matplotlib ggplot 样式?

python - 打开 CV RTSP 相机缓冲区滞后

javascript - 访问环境变量时出现意外标记

python - 以参数作为变量python的子进程调用

python - 无法在python3中获取子进程返回码

python - 使用 python 脚本从 xml 中提取属性和某些标记值

node.js - 我在 Express App 上看不到环境变量

java - 在 Windows 10 中设置环境变量以使用 java 和 javac