ホームページ >バックエンド開発 >Python チュートリアル >シェルを実行せずに変数を「subprocess.Popen()」に適切に渡すにはどうすればよいですか?

シェルを実行せずに変数を「subprocess.Popen()」に適切に渡すにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-28 06:41:10346ブラウズ

How to Properly Pass Variables to `subprocess.Popen()` without Shell Execution?

Subprocess.Popen() での変数受け渡しの問題

変数に格納されている引数を subprocess.Popen() に渡そうとすると、一部のユーザーが困難を経験する。これは、次のような引数を扱う場合に特に当てはまります:

servers[server]['address']
servers[server]['port']
servers[server]['pass']

以下に示すようにこれらの変数を Popen() コマンドに直接適用すると、エラーが発生する可能性があります:

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
)

解決策: シェルの実行を無効にする

この問題を解決するには、 Popen() 呼び出しの shell=True 引数。これにより、引数がシェルによって特別に扱われることがなくなり、代わりに文字列として渡すことができるようになります。

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 を使用すると、セキュリティが確保されることに注意してください。リスク。ユーザー入力を潜在的な脆弱性から保護するための代替方法を常に検討してください。

以上がシェルを実行せずに変数を「subprocess.Popen()」に適切に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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