Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Meluluskan Pembolehubah dengan Betul ke `subprocess.Popen()` tanpa Shell Execution?

Bagaimana untuk Meluluskan Pembolehubah dengan Betul ke `subprocess.Popen()` tanpa Shell Execution?

Barbara Streisand
Barbara Streisandasal
2024-11-28 06:41:10405semak imbas

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

Isu Melepasi Pembolehubah dengan Subproses.Popen()

Apabila cuba menghantar argumen yang disimpan dalam pembolehubah kepada subproses.Popen(), sesetengah pengguna mengalami kesukaran. Ini terutamanya berlaku apabila berurusan dengan hujah seperti berikut:

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

Menggunakan pembolehubah ini terus ke perintah Popen() seperti yang ditunjukkan di bawah boleh membawa kepada ralat:

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
)

Penyelesaian: Lumpuhkan Pelaksanaan Shell

Untuk menyelesaikan isu ini, alih keluar shell=True hujah daripada panggilan Popen(). Ini akan menghalang hujah daripada dirawat secara khusus oleh shell, membenarkannya dihantar sebagai rentetan sebaliknya.

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()

Perhatikan bahawa menggunakan shell=True untuk arahan yang mengambil input pengguna memberikan keselamatan risiko. Sentiasa pertimbangkan kaedah alternatif untuk melindungi input pengguna daripada kemungkinan kelemahan.

Atas ialah kandungan terperinci Bagaimana untuk Meluluskan Pembolehubah dengan Betul ke `subprocess.Popen()` tanpa Shell Execution?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn