Mit Programmen kommunizieren

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.
Antworten
alfonsospringer
User
Beiträge: 34
Registriert: Sonntag 24. August 2008, 21:50

Mit OS.System ist es ja möglich Befehle direkt an die Shell zu übergeneb und ausführen zu lassen. Wenn ich beispielsweise ein Nautilus starten möchte, so wäre dies mit

os.system("nautilus")

kein Problem.

Wenn ich jedoch mehr als nur die Übergabe von Befehlen an die Shell vornehmen möchte, beispielsweise eine Auswertung der Rückgabewerte, weis ich nicht, wie ich dies bewerkstelligen kann.

os.system("sudo nautilus")

würde zum Beispiel eine Instanz von Nautilus mit Adminrechten starten. Jedoch reagiert die Shell darauf natürlich mit einer Passwortabfrage. Nun möchte ich, das diese Passwortabfrage wiederum an mein Python Programm weitergeleitet wird und das Programm daraufhin die gewünschten Daten an die Shell schickt.

Ich bin mir völlig im klaren darüber, dass dies eine sicherheitstechnische Katastrophe darstellt. Hierbei handelt es sich aber auch nur um ein Beispiel. Vielen dank
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

sudo nautilus... Das is natürlich doof, wenn das System kein sudo hat, finde ich. Du solltest eher von dem Linuxbenutzer erwarten, dass'r es als root startet, das Programm.

(Edit: Falls du tatsächlich ein stdin oder stdout benutzen möchtest, solltest du in die Dokumentation von subprocess gucken und subprocess.PIPE als Argument für'n stdin benutzen... dann mit'r write Methode arbeiten. Wenn ich das richtig in Errinerung habe)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Grundsätzlich: subprocess, wird in dem Falle aber vermutlich nicht tun weil sudo stty o.ä. verwendet ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
alfonsospringer
User
Beiträge: 34
Registriert: Sonntag 24. August 2008, 21:50

Wie kann ich denn im allgemeinen eine Benutzereingabe durch ein Python Script simulieren? Ist das subprocess Modul da immer die richtige Lösung? Ein hochgegriffenes Beispiel wäre ein GUI-Frontend für nmap (ein Linux Netzwerkdiagnoseprogramm) zu schreiben (ich weiss, dass es dies bereits gibt -> Zenmap). Dabei handelt es sich um ein Tool, welches im Normalfall über die Shell bedient wird.

Bitte versteht, dass ich diese Frage stelle, bevor ich die subprocess Doku lese, und später feststelle, dass es doch nicht das richtige Modul ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

alfonsospringer hat geschrieben:Ist das subprocess Modul da immer die richtige Lösung?
Nein, wenn das Programm ttys verwendet, dann ist Pexpect die richtige Lösung. Ich habe auch schon überlegt, ob sudo das macht, wäre aber logisch.

Andererseits wird das Lesen der Subprocess-Doku dich nicht umbringen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
alfonsospringer
User
Beiträge: 34
Registriert: Sonntag 24. August 2008, 21:50

Andererseits wird das Lesen der Subprocess-Doku dich nicht umbringen.
Dem kann ich leider nicht wiedersprechen :) Hab grade nach ttys gesucht, bin aber nur auf eine Schnittstelle in der Elektronik gestoßen. Kann mir jemand kurz erklären was ttys ist und was ein Programm, dass ttys für die Eingabe/Ausgabe verwendet von einem anderen Programm unterscheidet? Ich hatte immer angenommen, dass diese "simplen" Text-Ein-und-Ausgaben immer identisch sind.

Vielen dank für eure bisherigen Posts

Gibt es eigentlich eine Liste der gebräcuhlichsten Python Modulen und deren Verwendungszwecken? Ich habe bisher nur den Global Module Index gefunden, aber da ich die Namen eines Moduls noch nicht 100%ig mit deren Inhalt assoziieren kann ist das zZ. ein wenig umständlich. Was ich meine:

import os - ermöglich Zugriff auf (gewisse) Funktionalitäten des Betriebssystems
import serial - ermöglicht Zugriff auf die serielle Schnittstelle
.
.
.

Wäre ungemein hilfreich
lunar

alfonsospringer hat geschrieben:
Andererseits wird das Lesen der Subprocess-Doku dich nicht umbringen.
Dem kann ich leider nicht wiedersprechen :) Hab grade nach ttys gesucht, bin aber nur auf eine Schnittstelle in der Elektronik gestoßen.
tty steht afaik für Teletypewriter. Heute bezeichnet man damit unter Unix-artigen Systemen serielle Schnittstellen und eben auch die Terminals (z.B. die virtuellen Terminals oder die Pseudoterminals von Terminalemulatoren).

Normalerweise reserviert der Kernel (kann sein, dass das auch die libc macht) beim Start eines Prozesses drei Dateideskriptoren, zwei für die Ausgabe und einen für die Eingabe, und assoziiert diese mit dem darunterliegenden tty-Gerät (aka controlling terminal).

Theoretisch kann man Passwörter auch von der Standardeingabe lesen (aka sys.stdin), allerdings hat das z.B. den Nachteil, dass diese Art der Eingabe von Shellumleitungen betroffen ist. Etwas wie "sudo command < myfile" wäre dann nicht möglich.

Deswegen öffnen Programme wie sudo das controlling terminal nochmal separat, setzen ein paar Terminaloptionen (u.a. wird das Echo ausgeschaltet, um die Buchstaben auszublenden), und lesen das Passwort dann direkt.

Der Nachteil dieser Methode ist, dass man solche Eingaben nur sehr schlecht automatisieren kann, weil das automatisierende Programm im Prinzip ein pty (pseudo terminal) reservieren muss, und das zu automatisierende Programm dann darauf ausführen muss, was ohne irgendwelche Komfort-Module relativ aufwendig ist. Außerdem ist diese Schnittstelle afaik zwar standardisiert, aber trotzdem mehr oder minder unportabel.
Gibt es eigentlich eine Liste der gebräcuhlichsten Python Modulen und deren Verwendungszwecken?
Mehrere, Forumssuche bemühen.
Antworten