python:subprocess在使用sudo时给出了不同的结果

问题描述 投票:1回答:1

我正在使用python做一些测试,我得到一个非常奇怪的问题,如下所示:

首先,我有一个名为1.sh的简单bash脚本:

#!/bin/sh

echo 'NOTHING'

然后我在下面的同一目录中创建一个名为test.py的python脚本:

#!/usr/bin/python

import subprocess
import os

os.environ['PS4'] = "aaa "
res=subprocess.Popen(['bash', '-x', '1.sh'], stderr = subprocess.PIPE)
print res.stderr.readlines()

令我惊讶的是,当我执行./test.py时,我得到了结果:

没有 ['aaa echo NOTHING \ n']

当我执行sudo ./test.py时,我得到:

没有 ['+ echo NOTHING \ n']

我需要的是aaa,而现在因为+它变成了sudo

为什么?

我的python的版本:2.7.12 系统:ubuntu 16.04

python python-2.7 ubuntu ubuntu-16.04 sudo
1个回答
0
投票

似乎bash中存在一个错误,允许通过root shell中的继承PS4变量进行任意代码注入。 https://bugzilla.redhat.com/show_bug.cgi?id=1379630

错误已修复,如果bash以root身份运行,则看起来PS4完全被忽略。你可以测试一下:

sudo bash
export PS4="xyzzy "
bash -x 1.sh

并注意到你仍然得+。无论你在PS4中设置什么,如果你的uid为零,它似乎永远不会显示。这当然不是一个解决方案,但如果这是真的,那么你想做的事情就不能用PS4完成。

作为一种解决方法,我建议逐行阅读res.stderr并运行基于正则表达式的替换,用您选择的提示替换^+

© www.soinside.com 2019 - 2024. All rights reserved.