1. ホーム
  2. python

[解決済み] サブプロセスにおける「shell=True」の実際の意味

2022-03-17 15:54:39

質問

を使用して異なるプロセスを呼び出しています。 subprocess モジュールを使用します。しかし、疑問があります。

以下のコードで

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

そして

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

どちらも動作します。ドキュメントを読んで、私は次のことを知りました。 shell=True は、シェルを通してコードを実行することを意味します。つまり、不在の場合は、プロセスが直接開始されることを意味します。

あるプロセスを実行し、その出力を取得する必要があるのです。シェルの中から呼び出すのと、シェルの外から呼び出すのとでは、どんな利点があるのでしょう。

解決方法は?

シェル経由で呼び出さないことのメリットは、「謎のプログラム」を呼び出さないことです。 POSIXでは、環境変数 SHELL Windowsでは、ボーンシェルの子孫は存在せず、cmd.exeのみです。

そのため、シェルを起動すると、ユーザーが選択したプログラムが起動され、プラットフォームに依存することになります。 一般的に言って、シェル経由の起動は避けてください。

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

環境変数の展開やファイルグロブが必要だと思う方は ILS 1992年頃、シェル経由でサブプログラムの呼び出しを行うネットワークサービスに対して行われた攻撃。 その例として、さまざまな sendmail を含むバックドア ILS .

まとめると shell=False .