私はtest.pyスクリプトの中でいくつかの引数を取るシェルコマンドラインを実行したいと思う。 test.pyはこれに類似の内側に見えるPythonのコマンドライン引数でshell = Trueを避ける
python test.py filename file_2 int
:
import sys
filename = sys.argv[1]
file_2 = sys.argv[2]
num = sys.argv[3]
subprocess.call("xargs /bin/bash build/install/programme/bin/programme option -n "+num+" --csv-file="+str(filename)+" -c files/"+str(file_2)+ "< /tmp/my_ids_"+str(file_2)+"_"+str(num),shell=True)
ポイントは、私はシェル= Trueのを使用して避けたいということですが、すべてのtest.pyは、以下のように実行されます私が今までに見つけたオプションは、私がコマンドラインで追加している引数に対して良い解決策を提供していません。
import sys
filename = sys.argv[1]
file_2 = sys.argv[2]
num = sys.argv[3]
subprocess.Popen(["xargs","/bin/bash","build/install/programme/bin/programme","option","-n", str(num),"--csv-file=",str(filename),"-c","files/",str(file_2),"<",str("/tmp/my_ids_"+str(file_2)+"_"+str(num))])
しかし、私は何の作業結果を得なかっ:
は、これまでのところ私は、例えばとして、Popen
でそれを分割を経由してさまざまなオプションを試してみました。 shlex
でも試しましたが、ドキュメントではコマンドに引数を追加できるオプションがありませんでした。
ご協力いただきありがとうございます。
なぜ 'shell = True'を避けたいですか? –
@ PedroLobitoこれは非効率で、引用エラーが発生しやすいためです。可能であれば、文字列引数のリストを 'execve'(または' exec'ファミリのどのメンバーが使用されているか)に直接渡すほうがずっと良いです。 – chepner
@PedroLobito、...私は "クォートエラー"を超えて - 文字列連結を介してコマンドを生成し、それらの文字列をコードとして評価することで、あなたのソフトウェアはインジェクション攻撃に対して脆弱になります。 [Bobby Tables](https://xkcd.com/327/)を考えてみましょう。彼は 'Johnny $(rm -rf $ HOME) '$(rm -rf $ HOME)'という兄弟を持っています。 –