Heim > Backend-Entwicklung > Python-Tutorial > Warum funktioniert „subprocess.Popen' nicht mit variablen Argumenten in Listen, wenn „shell=True' ist?

Warum funktioniert „subprocess.Popen' nicht mit variablen Argumenten in Listen, wenn „shell=True' ist?

Linda Hamilton
Freigeben: 2024-11-26 05:46:17
Original
144 Leute haben es durchsucht

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

Variablen an subprocess.Popen übergeben: Warum es mit Argumenten in Listen nicht funktioniert

Bei Verwendung von subprocess.Popen zum Aufrufen eines anderen Python Wenn Sie ein Skript verwenden, kann es zu Problemen bei der Übergabe von in Variablen gespeicherten Argumenten kommen. Dies kann auftreten, wenn Sie versuchen, einen Befehl wie den folgenden auszuführen:

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
)
Nach dem Login kopieren

Das Problem:

Das Problem entsteht durch die Verwendung von Shell=True. Wenn dieses Flag aktiviert ist, werden die an Popen() übergebenen Argumente auf Unix-Systemen anders behandelt. Die Shell interpretiert die Argumente als eine einzelne Befehlszeichenfolge, was zu unerwartetem Verhalten führen kann.

Die Lösung:

Um dieses Problem zu beheben, lassen Sie die Verwendung fallen of shell=True. Erstellen Sie stattdessen direkt eine Liste mit Argumenten und übergeben Sie sie an Popen(). Hier ist ein Beispiel:

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()
Nach dem Login kopieren

Indem Sie „shell=True“ entfernen und die Argumentliste manuell erstellen, stellen Sie sicher, dass die Variablen korrekt an das aufgerufene Skript übergeben werden.

Sicherheitshinweis:

Es ist wichtig zu beachten, dass die Übergabe von „shell=True“ für Befehle mit externen Eingaben ein Sicherheitsrisiko darstellen kann, wie in erwähnt die Teilprozessdokumentation. Wenn Sie in Ihrem Skript Benutzereingaben verarbeiten, wird dringend empfohlen, die Verwendung von „shell=True“ zu vermeiden, um potenzielle Schwachstellen zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum funktioniert „subprocess.Popen' nicht mit variablen Argumenten in Listen, wenn „shell=True' ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage