python - read - subprocess run cat




Pythonのサブプロセスモジュールで (2)

この質問には既に回答があります:

私がPythonのサブプロセスモジュールを使用しようとするたびに、私はまだいくつかのことを理解していないことがわかります。 現在、私はPythonモジュール内から3つのmp4ファイルに参加しようとしていました。

私が試したとき

z ='MP4Box -cat test_0.mp4 -cat test_1.mp4 -cat test_2.mp4 -new test_012d.mp4'
subprocess.Popen(z,shell=True)

すべてが働いた。

私が試したとき

z = ['MP4Box', '-cat test_0.mp4', '-cat test_1.mp4', '-cat test_2.mp4', '-new test_012d.mp4']
subprocess.Popen(z,shell=False)

私は次のエラーがあります:

Option -cat test_0.mp4 unknown. Please check usage

私は、 shell=Falseために、最初の要素が実行したいと思っていたリストを提供する必要があると思っていました。 この考え方で間違っているのですか、あるいは私が使いたいコマンドを作成する正しい方法がありますか?

また、サブプロセスでShell=Trueを使用するためのルールはありますか? これまでのところ、私が本当に知っているのは、 "それをしないでください - コードをシェル注入攻撃に公開する"ことです。 Shell=Falseはなぜこの問題を避けるのですか? 'Shell = True`を使用することに実際の利点はありますか?


shellがTrue場合、指定されたコマンドはシェルを通して実行されます。 これは、主に、ほとんどのシステムシェル上で提供される拡張制御フローのためにPythonを使用していて 、シェルパイプ、ファイル名ワイルドカード、環境変数拡張、ユーザーの自宅への展開などの他のシェル機能への便利なアクセスが必要な場合役立ちますディレクトリ。

shell=True場合は危険ですか?

信頼できないソースからの非初期化入力を含むシェルコマンドを実行すると、プログラムがシェルインジェクションに対して脆弱になり、重大なセキュリティ上の欠陥が発生し、任意のコマンドが実行される可能性があります。 このため、 コマンド文字列が外部入力から構成されている場合は、 shell=True使用することを強くお勧めします

例えば。 ( docsから取られた)

>>> from subprocess import call
>>> filename = input("What file would you like to display?\n")
What file would you like to display?
non_existent; rm -rf / #
>>> call("cat " + filename, shell=True) # Uh-oh. This will end badly..

すべての単一の引数をリストの1つの要素として指定する必要があります。

z = ['MP4Box', '-cat', 'test_0.mp4', '-cat', 'test_1.mp4', '-cat', 'test_2.mp4', '-new', 'test_012d.mp4']
subprocess.Popen(z,shell=False)

これは通常、ファイル名でシェルの特別な文字をエスケープする必要がないため、やりたいことです。





subprocess