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
Lepaskan: 2024-11-28 06:41:10
asal
379 orang telah melayarinya

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']
Salin selepas log masuk

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
)
Salin selepas log masuk

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()
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan