subprocess modul

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

Grüß euch,

ich lerne zur Zeit Python und experimentiere erst ein wenig herum.
Da das neue 2.4er Modul "subprocess" viele der älteren execution environments ersetzen soll, möchte ich mehr darüber erfahren. In meinem Buch und in den Python Docs steht schon einiges, doch habe ich noch einige Fragen.

Folgendes Szenario:
Ich möchte ein auf der Festplatte vorliegendes Programm in meinem Skript aufrufen, natürlich Parameter übergeben und dann dessen Output von dem SDTOUT in ein File umleiten.

Danke euch für die Vorschläge.

PS: Wie würde eine os.fork, os.exec*, os.wait* variante davon aussehen.

Ich kann mal schemenhalft angeben was ich mir denke.

Code: Alles auswählen

import os

ret = os.fork()
if ret == 0
    execl('binaryfile', ['binaryfile', 'argument1', ...])
    #oder 
    execvp('perl Script.pl', ['perl Script.pl', 'argument1', ...])
    #und falls python
    execfile('Script.py')
else
    os.wait()
Auch hier bleibt meine Frage wie man den Output abfängt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi und willkommen im Forum,

am besten Du schaust Dir mal die Moduldokumentation an und vielleicht magst Du Dir auch die [wiki=Neue_Features#Subprocess]entsprechende Wikiseite[/wiki] ansehen und hier im Forum suchen? (Es gab nämlich schon viele Threads zum Thema subprocess ;-) .)
Was das Thema "in ein File umleiten" anbelangt: Kennst Du das logging Modul? Das kann u. U. - je nachdem was Du genau tun möchtest - nützlich sein.

Gruß,
Christian
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

der Höflichkeit halber hier einfach mal ein schnelles (ungetestetes) Beispiel mit subprocess:

Code: Alles auswählen

from subprocess import Popen

# das tolle an Popen ist meiner Meinung nach, dass man alle Moeglichkeiten
# vereint hat, die es vorher gab. So ja auch der Sinn, der Sache ;)

cmd = list()
cmd.append(pfad_zum_programm)
cmd.append(erstes_argument)
cmd.append(zweites_argument)
cmd.append(drittes_argument)

# da du die Ausgabe in eine Datei umleiten willst:
stdout = file("ausgabe.log", "r")
stderr = file("error.log", "r")

# nun zum eigentlichen Programmaufruf:
Popen(cmd, stdout=stdout, stderr=stderr, close_fds=True)

# close_fds=True sorgt hier dafuer, dass stdout und stderr nach
# ausfuehrung des Programmes geschlossen werden. Standardmäßig
# steht es auf False
Ja ich denke das ist das wichtigste... fuer kleinere Schusseligkeitsfehler uebernehme ich keine Haftung, nein ich verschenke sie sogar an dich ;)

MfG
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

In Anlehnung zum bisherigen:

Benutzt man das subprocess-modul um Hooks zu programmieren?
Und wie sieht das unter Python aus?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

skypa hat geschrieben:Benutzt man das subprocess-modul um Hooks zu programmieren? Und wie sieht das unter Python aus?
Hi skypa!

Ich arbeite unter Visual Basic 6 sehr oft mit Hooks, die Python-Programme aufrufen. Dort verwende ich eine spezielle Art von ShellWait, damit mir das Programm während der Ausführung nicht wegläuft. ;-)

Unter Python kannst du mit subprocess andere Programme aufrufen und darauf warten, bis die Arbeit getan ist. Das wäre für mich so ein Hook, wenn ich z.B. in einem Ordner Python-Programme hätte, die nur unter bestimmten Umständen vom Hauptprogramm aufgerufen werden und evt. etwas an das Hauptprogramm zurück geben.

Du kannst an das aufgerufene Programm, Parameter über die Kommandozeile übergeben. Du kannst über so einen Kommandozeilenparameter den Pfad zu einer Datei mit Daten übergeben. Du kannst aber auch direkt über STDIN des aufgerufenen Programms Daten übergeben.
http://www.python-forum.de/topic-4941.html

Daten bekommst du z.B. über STDOUT des aufgerufenen Programms zurück. Über STDOUT kannst du soger gepickelte Daten zurück geben. Du könntest aber auch die Ergebnisdaten in eine Datei schreiben und diese vom Hauptprogramm auslesen lassen. So habe ich es z.B. bei meinem letzten Projekt gemacht.

Das Handelskassenprogramm, ein Visual Basic 6 Programm, erstellt eine INI-Datei. Das Python-Programm wird mit ShellWait aufgerufen. Dabei wird über Kommandozeilenparameter der Pfad zur Ini-Datei übergeben. Das Python-Programm liest die INI-Datei aus und weiß daraufhin was es zu tun hat. In der INI-Datei steht auch ein Pfad zur erwarteten Ergebnisdatei. Das Python-Programm erstellt eine neue INI-Datei und schreibt die Ergebnisse in diese Datei. Sobals das Python-Programm beendet ist, liest das VB6-Programm die Erebnis-INI-Datei aus und arbeitet weiter. Das hört sich komplizierter an als es ist. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Naja fast Gerold :D
Aber wir meinen dasgleiche glaub ich...
Mit Hooking mein ich das eigentliche "einhaken" in andere Software bzw Prozesse...
z.B. wie Bot Programme... Map Hacks (Diablo2)...

Ich will nicht unbedingt sowas programmieren (zumindest nicht jetzt)...
aber find ichs recht intressant, da man damit doch Reverse Engineering betreiben kann ?! könnte man doch auch auf viren oder Trojaner übertragen um Funktionsweisen zu studieren?!

Oder bin ich einfach total im falschen film?
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

Hooks haben meines Wissens mehrere Bedeutungen.

Hooks sind erstens überwachende Funktionen oder zweitens custom Module die vom Programmierer an eigene Bedürfnisse angepasst werden können.
könnte man doch auch auf viren oder Trojaner übertragen um Funktionsweisen zu studieren?!
Na ich hoffe, dass der obige Satz in einem Anflug von Witzigkeit geschrieben worden ist...
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

Sonst danke ich den übrigen für ihre Hilfe.

Ich werde mir die Beispiele ansehen.

Weiß jemand ob das Popen Modul aus subprocess, sowohl auf Win32 als auch auch Unix Platformen arbeitet. Ich hatte beim Ausprobieren das Gefühl, dass nicht alle Methoden auch in Windows existieren (ich meine in etwa wie zum Beispiel os.fork() auf Windows keine Funktionalität hat).
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, es gibt ein paar Methoden die nur mit Linux/Unix gibt... Das liegt einfach am OS, IMHO... Steht alles in der Doku: http://docs.python.org/lib/node533.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Ich denke (weiß aber nicht hundertprozentig) das alles unter Windoze gehen muesste, was mit dem Subprocess-Modul gemacht worden ist.

So dinge wie os.fork koennten da schon schwieriger werden. Ein weiteres Pro fuer subprocess (ich mag subprocess 8) ).

Zu den Hooks: Ich glaube, ein reinen Pythonprogramm ist kaum faehig dazu, ohne weiteres in Speicherbereichen anderer Programme rumzupfuschen. Ich denke dazu braucht es ein C-Modul (was aber unter Python wiederum kein Problem ist).

Gruesse
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

nkoehring hat geschrieben:in Speicherbereichen anderer Programme rumzupfuschen.
Ich kenne mich da nicht wirklich aus. Aber IMHO verhindert das OS so etwas, oder? Da muss man sicherlich tief in die Trickkiste greifen.

Um Trojaner und Co. zu untersuchen eignet sich wohl eine VM.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

jens hat geschrieben:
nkoehring hat geschrieben:in Speicherbereichen anderer Programme rumzupfuschen.
Ich kenne mich da nicht wirklich aus. Aber IMHO verhindert das OS so etwas, oder?
Das sollte es. Das waere ja auch noch schoener, wenn man mit fehlerhaften Pointern nicht nur sein eigenes, sondern auch andere Programme abschmieren lassen koennte...
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Wenn ich euch richtig verstanden ist es möglich, ABER ihr wisst nicht wie?!
und ja ich meine mit hooking den speicherbereich verändern.. sprich das es abschmiert, sprich das man es manipulieren kann...
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Also du meinst das, was auch Debugger machen?

Es gibt unter Linux den System-Call ptrace. Da gibt es aber keine Python-Anbindung fuer.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

In etwas wie ein Debugger... ich meine eher eine Art von Injektion.

Ich hab vor geraumer Zeit mal ein Hook in Delphi (war das glaub ich gesehen). Und will halt wissen ob das auch mit python möglich ist...

gutes beispiel ist glaub ich ein maphack. er "injeziert" sich in die Anwendung, sucht sich die infos die er eben brauch, und gibt dann eine Route im Spiel selbst aus...

Ich wills gar net so umfangreich... aber intressiert mich schon, ob ich grad eine Sprache lerne mit der ich ALLES machen kann, oder fast alles...
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Sehr systemnahe Sachen sind mit Python ein wenig schwierig. Dazu braucht es meist C-Module oder eine Anbindung an ein solches.

Ansonsten ist zwar IMHO das lesen eines fremden Speicherbereichs kein Problem, aber das schreiben duerfte so oder weiteres vom Betriebssystem verwaehrt werden.

Fuer solche Sachen gibt es ja dann Umwege, die die Prozesse dann mit Elternrechten forken. Also damit meine ich, dass man ein Programm schreibt, welches als Hook arbeiten soll (einen "Trainer" zB), das das zu hookende Programm selbst startet, undzwar als Unterprozess. So hat der Hook die noetigen Rechte, direkt den Speicherbereich zu bestimmen und zu bearbeiten.

Ansonsten waere es noch moeglich etwas auf Kernelebene laufen zu lassen, womit es auch wieder die Rechte bekommen koennte (aber auch das ist nicht einfach).

Nur leider ist all das unter Python eben nicht ohne weiteres machbar. Prozesse forken, ja... ihre Speicherbereiche manipulieren, nein.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

Um ehrlich zu sein würde, ich doch arg enttäuscht werden, wenn sich dieses Forum als Plattform für "Cracking" entpuppen würde.

Ich bitte die Teilnehmer des Forums keine Tipps für die Erschaffung von Cracks und Cheats zu geben und ich würde auch den zuständigen Moderator auffordern solcherlei Fragen zu löschen. Dafür gibt es weiß Gott genügend andere Adressen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wie bitte? Darum geht es hier doch gar nicht. Natürlich könnte man best. Hooks mißbrauchen, aber im allgemeinen ist die Intention doch eine ganz andere.

Gruß,
Christian
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

Grüß dich Christian,

lies dir doch die postings von skypa noch einmal durch. Ich denke, dass sie unmißverständlich sind. Ein paar Zitate:
und ja ich meine mit hooking den speicherbereich verändern.. sprich das es abschmiert, sprich das man es manipulieren kann...
Mit Hooking mein ich das eigentliche "einhaken" in andere Software bzw Prozesse...
z.B. wie Bot Programme... Map Hacks (Diablo2)...
könnte man doch auch auf viren oder Trojaner übertragen um Funktionsweisen zu studieren?!
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ach herrje, mit dem letzten Zitat hast Du natürlich recht, aber:
- wenn er eine so umständliche Methode verwenden will, um etwas zu lernen ... kein weiteres Kommentar hier
- an anderer Stelle könnte er viel mehr lernen.
- wenn er auf diese Weise seine Spiele manipulieren möchte: Bitte sehr. (Ich glaube allerdings nicht, daß es so ohne Weiteres funktionieren wird ;-) .)

Aber auch so hast Du recht: Der Thread ist ziemlich entglitten.

Gruß,
Christian
Antworten