将python子进程用作另一个用户时的错误环境

戴夫·塞夫

我有一个以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”。如果我以其他用户的身份生成子流程,是否需要有人来获取用户的环境?

VooDooNOFX

您实际上在这里对子流程没有任何问题。子进程正在从当前环境传递环境,因此,当您“ 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将一个查询的结果用作另一个查询的子数组

来自分类Dev

当另一个子进程完成时,如何终止子进程?

来自分类Dev

将查找结果用作另一个进程的命令行参数

来自分类Dev

使用SAM或Cloudformation将另一个堆栈的输出用作lambda的环境变量

来自分类Dev

使用python multiprocessing子进程如何终止另一个子进程?

来自分类Dev

将类型参数用作传递给宏实现的另一个类型的类型参数时,类型错误

来自分类Dev

如何使用子进程使用python将输入发送到另一个程序

来自分类Dev

Python杀死一个子进程(启动另一个进程)并再次启动

来自分类Dev

如何杀死另一个用户的后台进程?

来自分类Dev

如何杀死另一个用户的进程?

来自分类Dev

如何将环境变量导出为另一个用户

来自分类Dev

sudo作为其环境的另一个用户

来自分类Dev

获取另一个用户的环境变量?

来自分类Dev

采用另一个进程的子窗口

来自分类Dev

将另一个项目用作库

来自分类Dev

将类用作另一个类的属性

来自分类Dev

使用子进程调用/ popen从另一个python脚本执行python脚本

来自分类Dev

Python; 如何正确调用另一个python脚本作为子进程

来自分类Dev

Python-通知另一个线程在子进程上被阻塞

来自分类Dev

发生时将内核消息传递到另一个进程

来自分类Dev

从另一个进程引用一个内存分配指针指向的元素时出现分段错误

来自分类Dev

通过子过程从另一个python脚本调用python脚本时导入错误的包

来自分类Dev

使用子进程的stdout作为另一个进程的stdin时,有时数据不会传递给第二个子进程

来自分类Dev

将Python对象传递给另一个Python进程

来自分类Dev

Python,WindowsError:[错误32],文件正在由另一个进程使用

来自分类Dev

将ScriptPath从一个用户复制到另一个用户时出现问题

来自分类Dev

Python子进程无法访问.bat文件,因为它已被另一个进程使用

来自分类Dev

一个python进程为另一个python进程提供信息

来自分类Dev

Python:如何从另一个进程读取变量?

Related 相关文章

  1. 1

    将一个查询的结果用作另一个查询的子数组

  2. 2

    当另一个子进程完成时,如何终止子进程?

  3. 3

    将查找结果用作另一个进程的命令行参数

  4. 4

    使用SAM或Cloudformation将另一个堆栈的输出用作lambda的环境变量

  5. 5

    使用python multiprocessing子进程如何终止另一个子进程?

  6. 6

    将类型参数用作传递给宏实现的另一个类型的类型参数时,类型错误

  7. 7

    如何使用子进程使用python将输入发送到另一个程序

  8. 8

    Python杀死一个子进程(启动另一个进程)并再次启动

  9. 9

    如何杀死另一个用户的后台进程?

  10. 10

    如何杀死另一个用户的进程?

  11. 11

    如何将环境变量导出为另一个用户

  12. 12

    sudo作为其环境的另一个用户

  13. 13

    获取另一个用户的环境变量?

  14. 14

    采用另一个进程的子窗口

  15. 15

    将另一个项目用作库

  16. 16

    将类用作另一个类的属性

  17. 17

    使用子进程调用/ popen从另一个python脚本执行python脚本

  18. 18

    Python; 如何正确调用另一个python脚本作为子进程

  19. 19

    Python-通知另一个线程在子进程上被阻塞

  20. 20

    发生时将内核消息传递到另一个进程

  21. 21

    从另一个进程引用一个内存分配指针指向的元素时出现分段错误

  22. 22

    通过子过程从另一个python脚本调用python脚本时导入错误的包

  23. 23

    使用子进程的stdout作为另一个进程的stdin时,有时数据不会传递给第二个子进程

  24. 24

    将Python对象传递给另一个Python进程

  25. 25

    Python,WindowsError:[错误32],文件正在由另一个进程使用

  26. 26

    将ScriptPath从一个用户复制到另一个用户时出现问题

  27. 27

    Python子进程无法访问.bat文件,因为它已被另一个进程使用

  28. 28

    一个python进程为另一个python进程提供信息

  29. 29

    Python:如何从另一个进程读取变量?

热门标签

归档