我使用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
时,我得到了结果:
NOTHING
[' aaa echo NOTHING \ n']
当我执行sudo ./test.py
时,我得到:
NOTHING
[' + echo NOTHING \ n']
我需要的是aaa
,而现在因+
而成为sudo
。
为什么?
我的python的版本:2.7.12
系统:ubuntu 16.04
答案 0 :(得分:0)
似乎bash中存在一个错误,允许通过root shell中的继承PS4变量进行任意代码注入。 https://bugzilla.redhat.com/show_bug.cgi?id=1379630
该错误已得到修复,如果以root身份运行bash,则会显示PS4完全被忽略。你可以测试一下:
sudo bash
export PS4="xyzzy "
bash -x 1.sh
并注意到你仍然得+。无论你在PS4中设置什么,如果你的uid为零,它似乎永远不会显示。这当然不是一个解决方案,但如果这是真的,那么你想做的事情就不能用PS4完成。
作为一种解决方法,我建议逐行阅读res.stderr
并运行基于正则表达式的替换,将^+
替换为您选择的提示。