我正在使用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
似乎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
并运行基于正则表达式的替换,用您选择的提示替换^+
。