サブプロセスにおける「shell=True」の実際の意味 質問する

サブプロセスにおける「shell=True」の実際の意味 質問する

モジュールを使用してさまざまなプロセスを呼び出していますsubprocess。ただし、質問があります。

次のコードでは:

callProcess = subprocess.Popen(['ls', '-l'], shell=True)

そして

callProcess = subprocess.Popen(['ls', '-l']) # without shell

どちらも動作します。ドキュメントを読んだ後、シェルを介してコードを実行することを意味することがわかりましたshell=True。つまり、存在しない場合は、プロセスが直接開始されることを意味します。

では、私の場合はどちらを優先すべきでしょうか。プロセスを実行してその出力を取得する必要があります。シェル内から呼び出すか、シェル外から呼び出すかによって、どのような利点があるのでしょうか。

ベストアンサー1

シェル経由で呼び出さないことの利点は、「謎のプログラム」を呼び出さないことです。POSIX では、環境変数によって「SHELLシェル」として呼び出されるバイナリが制御されます。Windows では、Bourne Shell の派生プログラムはなく、cmd.exe のみがあります。

したがって、シェルを呼び出すと、ユーザーが選択したプログラムが呼び出され、プラットフォームに依存します。一般的に、シェル経由の呼び出しは避けてください。

シェル経由で呼び出すと、シェルの通常のメカニズムに従って環境変数とファイル グロブを展開できます。POSIX システムでは、シェルはファイル グロブをファイルのリストに展開します。Windows では、ファイル グロブ (例: "*.*") はシェルによって展開されません (ただし、コマンド ラインの環境変数はcmd.exe によって展開されます)。

環境変数の拡張とファイル グロブが必要と思われる場合は、シェル経由でサブプログラム呼び出しを実行するネットワーク サービスに対する 1992 年頃の攻撃を調べてください。例には、に関連するさまざまなバックドアILSが含まれます。sendmailILS

要約すると、 を使用しますshell=False

おすすめ記事