【发布时间】:2020-08-01 18:21:32
【问题描述】:
我正在尝试以 popen 和 subprocess 的不同用户身份在 python 3.6 中执行命令,但它仍将以调用脚本的用户身份执行(我打算以 root 身份调用它)。我正在使用线程,因此当 2 个线程并行执行时,不要侵犯用户权限,这一点很重要。
proc = subprocess.Popen(['echo $USER; touch myFile.txt'],
shell=True,
env={'FOO':'bar', 'USER':'www-data'},
stdout=subprocess.PIPE)
上面的例子仍然会用我的user_id 1000创建myFile.txt
我尝试了不同的方法:
按照Run child processes as different user from a long running Python process 中的描述尝试通过复制 os.environment 并更改用户等
(注意这是针对 python 2)按照https://docs.python.org/3.6/library/subprocess.html#popen-constructor 中的描述尝试使用
start_new_session=True
我最后的选择是在命令前加上sudo -u username command,但我认为这不是优雅的方式。
【问题讨论】:
-
sudo -u username command确实是一种优雅的方式! -
@lemonhead 我在 1 下提到过。
-
@Chris 是否有理由认为方法不能达到您的目标?我认为您在示例中缺少的部分是通过将函数传递给
preexec_fn进行降级 -
@lemonhead 正如我在 1 中提到的那样:我尝试了这种方法,但它也不起作用。我打电话给:
subprocess.Popen(['echo $USER; touch myFile.txt'], shell=True, env={'FOO':'bar', 'USER':'www-data'}, stdout=subprocess.PIPE, preexec_fn=demote(33,33))并降级返回异常demote(33,33)<function demote.<locals>.result at 0x7f7f20cd1ea0>
标签: python python-3.x subprocess