私はのような何か試してみた:つまり...
#!/usr/bin/python
from __future__ import print_function
import shlex
from subprocess import Popen, PIPE
def shlep(cmd):
'''shlex split and popen
'''
parsed_cmd = shlex.split(cmd)
## if parsed_cmd[0] not in approved_commands:
## raise ValueError, "Bad User! No output for you!"
proc = Popen(parsed_command, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
return (proc.returncode, out, err)
は(shlex.splitを聞かせて)ほとんどの作業を行います。シェルのコマンドラインを解析したり、パイプ演算子を見つけたり、独自のパイプラインを設定しようとはしません。もしあなたがそれをやろうとするなら、基本的に完全なシェルシンタックスパーサーを書かなければならないでしょう。そして、あなたはひどく多くの配管作業を終わらせます。もちろん
これは疑問、なぜちょうどシェル= Trueの(キーワード)オプションでpopenのを使用しないを上げますか?これにより、シェルに文字列(分割も解析もしない)を渡すことができ、望むように結果を集めることができます。ここの私の例では、コマンドに含まれる可能性のあるパイプライン、バッククォート、ファイル記述子のリダイレクションなどは処理されません。コマンドのリテラル引数として表示されます。したがって、それはまだシェル=真で実行してより安全です ...私はコマンドをある種の「承認されたコマンド」辞書またはセットに照らしてチェックするという馬鹿げた例を与えてきました。それ以前に引数を正規化することを要求しない限り、絶対パスに正規化するほうが意味があります。コマンド文字列をこの関数に渡します。
* subprocess.call()*を使用して/ errを読み取ることができます。 [マニュアルを確認してください](http://docs.python.org/2/library/subprocess.html)。コマンドが大量の出力を生成しないことを確認してください。 – tuxuday