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

时间:2018-01-03 10:12:29

标签: python python-2.7 ubuntu ubuntu-16.04 sudo

我使用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

1 个答案:

答案 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并运行基于正则表达式的替换,将^+替换为您选择的提示。