Seite 1 von 1
Wie rufe ich korrekt ein externes Programm auf
Verfasst: Dienstag 20. Dezember 2022, 14:02
von drnicolas
Ich habe hier eine Batch-Datei, in der ein Tool aufgerufen wird.
Dem Tool wird die Nummer eines COM-Ports übergeben sowie jeweils ein Paar aus einem Befehl und einem Dateipfad
Das sieht in etwa so aus:
Code: Alles auswählen
c:\med7net\WinCrd2XML.exe -P %port% -S c:\med7net\egk1.xml -p c:\med7net\egk2.xml -a c:\med7net\egk3.xml -g c:\med7net\egk4.xml -R c:\med7net\egk5.xml -M 1 -K c:\med7net\daten.xml -C 1 -V c:\med7net\eGK_MFEF_Version.xml
In einer cmd-umgebung aufgerufen macht das Programm exakt das was es soll - es liest Kartendaten aus einem Kartenleser und legt verschiedene Daten in einzelne Files. Danach sind die Kartendaten vom Leser verschwunden
Dies versuche ich nun als Python-Programm nachzubilden
Leider funktioniert es nicht (ganz). Ich kann erkennen, das auf den Kartenleser zugegriffen wird, aber die Dateien sind dann leer und die Daten verschwinden nicht.
Was mache ich falsch?
Code: Alles auswählen
result=subprocess.run(['c:/med7net/WinCrd2XML.exe', '-P' , '3','-S','c:/med7net/egk1.xml', '-p', 'c:/med7net/egk2.xml',
'-a', 'c:/med7net/egk3.xml', '-g', 'c:/med7net/egk4.xml', '-R', 'c:/med7net/egk5.xml', '-M', '1',
'-K', 'c:/med7net/daten.xml', '-C', '1', '-V', 'c:/med7net/eGK_MFEF_Version.xml'] ,
stdout=subprocess.PIPE, stdin=subprocess.PIPE)
result.returncode enthält dann einen Fehlercode; ändere ich die 3 in etwas anderes, dann kommt ein anderer Fehlercode. insofern scheint das wenigstens richtig zu sein.
Es hat auch schonmal funktioinert, ich weiß aber nicht ob und was ich geändert habe.
Interessanterweise scheint es zu funktionieren, wenn ich das Programm aus der cmd-Umgebung direkt aufrufe.
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Dienstag 20. Dezember 2022, 14:25
von grubenfox
was macht:
Code: Alles auswählen
result=subprocess.run('c:/med7net/WinCrd2XML.exe -P 3 -S c:/med7net/egk1.xml -p c:/med7net/egk2.xml -a c:/med7net/egk3.xml -g c:/med7net/egk4.xml -R c:/med7net/egk5.xml -M 1 -K c:/med7net/daten.xml -C 1 -V c:/med7net/eGK_MFEF_Version.xml' , shell=True)
mangels eigener Erfahrung mit der run-Methode nur eine Vermutung dass sich mit 'shell=True' etwas wesentliches ändert.
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Dienstag 20. Dezember 2022, 14:53
von __blackjack__
@grubenfox: Bitte nicht. Da wird etwas wesentliches verändert: Man startet nicht mehr das Programm, sondern eine Shell, der dann diese Zeichenkette als Kommando übergeben wird, und die dann das Programm ausführt. Mit all den Problemen die sich daraus ergeben. Das sollte man nur machen wenn man tatsächlich die Shell dazwischen *braucht*, was nur selten der Fall ist.
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Dienstag 20. Dezember 2022, 15:01
von __blackjack__
@drnicolas: Bist Du denn sicher das Port 3 korrekt ist? Was ist denn der Wert von ``os.environ["port"]``?
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Dienstag 20. Dezember 2022, 17:56
von grubenfox
drnicolas hat geschrieben: Dienstag 20. Dezember 2022, 14:02
In einer cmd-umgebung aufgerufen macht das Programm exakt das was es soll - es liest Kartendaten aus einem Kartenleser und legt verschiedene Daten in einzelne Files. Danach sind die Kartendaten vom Leser verschwunden
@ __blackjack__: in der Shell bzw. cmd-Umgebung scheint das Prgramm ja exakt das zu machen was es soll.
Wobei ich diesen Teil
drnicolas hat geschrieben: Dienstag 20. Dezember 2022, 14:02
Interessanterweise scheint es zu funktionieren, wenn ich das Programm aus der cmd-Umgebung direkt aufrufe.
nicht einordnen kann... ich gehe davon aus dass beim unteren Zitat mit dem 'Programm' das Python-Programm und nicht das WinCrd2XML.exe gemeint ist. Das ist wohl das Programm aus dem ersten Zitat.
Aber wenn das ohne Shell geht, gerne. Solche Probleme kommen auf mich vielleicht auch noch zukünftig zu...
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Dienstag 20. Dezember 2022, 19:41
von Dennis89
Hallo,
@grubenfox ich denke __blackjack__ wollte nicht sagen, dass 'shell=True' nicht funktioniert oder ein fallsches Ergebnis liefert, sondern auf die Gefahren damit hinweisen. Die findet man auch häufig im Netz,
z.B. hier. Falls ich dich falsch verstanden habe, ist der Link sicherlich nie verkehrt.
run hätte die Teile des Befehls auch gerne in einer Liste, dieser Teil müsste vom TE schon passen.
Dafür könnte sich
shlex.split anbieten.
Grüße
Dennis
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Mittwoch 21. Dezember 2022, 00:15
von __blackjack__
Die Liste passt schon, bis auf eben vielleicht der "%port%"-Teil der durch "3" ersetzt wurde, wo jetzt die Frage ist ob das tatsächlich der genaue Inhalt der %port%-Umgebungsvariable ist.
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Mittwoch 21. Dezember 2022, 04:14
von grubenfox
Also subprocess.run mit "shell=True" liefert hoffnungsweise eine identische Umgebung wie beim händischen Aufruf. Wenn es denn mit "shell=True" und %port% geht und ohne nicht, dann scheint da irgendeine Funktionalität die die Shell einschleppt, möglicherweise noch wichtig zu sein. Wobei: cmd-umgebung liest sich für mich wie "Windows Powershell" (mit irgendwelchen cmdlet's die man da offenbar ausführt/aufrufen kann).
Von der habe ich nun genau gar keine Ahnung. außer dass in irgendwelchen Beispielen die ich gesehen hatte, die Befehle immer unnatürlich lang waren (im Vergleich zu Linux-Shells).
Aber auch bei großer Ahnungslosigkeit in Sache PowerShell erscheint mir bei genauerer Betrachtung zum einen auch nur die %port%-Angabe der Teil zu sein den eine Shell hier sinnvoll verändern könnte und zum anderen der einzige Unterschied zwischen den aufgeführten Beispielen.
Da bin jetzt auch ich bei der Frage: ist eine 3 als Portangabe wirklich korrekt bzw. was steht in der passenden Umgebungsvariablen.
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Mittwoch 21. Dezember 2022, 07:02
von sparrow
@grubenfox: Man macht aber Dinge richtig und nicht "weil sie irgendwie gehen". Wenn man eine Shell starten möchte, dann ist der Parameter richtig. Will man hier aber nicht. Und ich sehe hier auch nicht, wo du die Information gefunden hast, dass die Shell "hier etwas einschleppt". Den richtigen Tipp hat __blackjack__ schon gegeben. %port% ist eine Umgebungsvariable.
Wie du aus cmd-Umgebung "powershell" ableitest ist mir auch ein Rätsel. Eine batch-Datei und der Aufruf eines Kommandos haben nun eher weniger damt zu tun.
Also noch von einer dritten Stimme: shell=True braucht man nur, wenn man eine Shell starten will. Und auch .run will eigentlich eine Liste. Also eigentlich alles genau nicht so wie in deinem Beitrag.
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Mittwoch 21. Dezember 2022, 13:22
von __blackjack__
@grubenfox: „cmd-umgebung“ muss nicht PowerShell heissen. Die Shell die unter DOS noch ``command.com`` hiess, wurde unter Windows zu ``cmd.exe``.
Re: Wie rufe ich korrekt ein externes Programm auf
Verfasst: Donnerstag 22. Dezember 2022, 13:04
von DeaD_EyE
Ich habe dir mal eine schöne Sicherheitslücke programmiert:
Code: Alles auswählen
import subprocess
verzeichnis = input("Verzeichnis auflisten: ")
subprocess.run(f"ls -l {verzeichnis}", shell=True)
Einfach mal als Pfad
/home;uname -a eingeben.
Dann wird
ls -l pfad ausgeführt und anschließend
uname -a.
Die Shell interpretiert Leerzeichen als Trenner und ein Semikolon als neue Zeile.
Das Programm packt man am besten noch auf einen virtuellen Server und baut eine WebApp drumherum, damit man dann innerhalb kürzester Zeit unerwünschte Gäste auf dem Server hat.
Manchmal sind die Lösungen, die zu einem schnellen Ergebnis führen, besonders einfach angreifbar. Die Eingaben eines Nutzers können gefährlich sein.