ホームページ >バックエンド開発 >Python チュートリアル >「shell=True」の場合、「subprocess.Popen」がリスト内の変数引数を処理できないのはなぜですか?

「shell=True」の場合、「subprocess.Popen」がリスト内の変数引数を処理できないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-26 05:46:17156ブラウズ

Why Doesn't `subprocess.Popen` Work with Variable Arguments in Lists When `shell=True`?

subprocess.Popen に変数を渡す: リスト内の引数を処理できない理由

subprocess.Popen を使用して別の Python を呼び出す場合スクリプトを使用すると、変数に格納された引数を渡す際に問題が発生する可能性があります。これは、次のようなコマンドを実行しようとすると発生する可能性があります。

p = subprocess.Popen(
    ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"],
    shell=True,
    stdout=subprocess.PIPE
)

問題:

この問題は、shell=True の使用が原因で発生します。このフラグが有効な場合、Popen() に渡される引数は Unix システムでは異なる方法で処理されます。シェルは引数を単一のコマンド文字列として解釈するため、予期しない動作が発生する可能性があります。

解決策:

この問題を解決するには、使用を削除します。シェル = True の。代わりに、引数のリストを直接作成し、それを Popen() に渡します。以下に例を示します。

import sys
from subprocess import Popen, PIPE

# Populate list of arguments
args = ["mytool.py"]
for opt, optname in zip("-a -x -p".split(), "address port pass".split()):
    args.extend([opt, str(servers[server][optname])])
args.extend("some additional command".split())

# Run script
p = Popen([sys.executable or 'python'] + args, stdout=PIPE)
# ... Use p.stdout here
p.stdout.close()
p.wait()

shell=True を削除して引数リストを手動で作成すると、変数が呼び出されたスクリプトに正しく渡されるようになります。

セキュリティ上の注意:

外部入力を伴うコマンドに shell=True を渡すと、セキュリティ リスクが生じる可能性があることに注意することが重要です。サブプロセスのドキュメントに記載されているとおりです。スクリプトでユーザー指定の入力を処理する場合は、潜在的な脆弱性を防ぐために、shell=True の使用を避けることを強くお勧めします。

以上が「shell=True」の場合、「subprocess.Popen」がリスト内の変数引数を処理できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。