ssh-Modul

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 14. Juni 2006, 14:00

(Stichworte: ssh, scp, pty, pseudo terminal, pseudoterminal)

Ich hatte mich vor einiger Zeit mal damit beschaeftigt, ssh ueber Pseudo-Terminals zum Laufen zu bringen, jetzt habe ich das wieder aufgegriffen und etwas recht Brauchbares herausbekommen.

Das Modul unten stellt Funktionen fuers Einloggen, Ausloggen und die wichtigsten Befehle auf dem Remote Host zur Verfuegung, ausserdem eine scp-Implementation. (Das Ganze ist natuerlich noch erweiterbar.)

Das groesste Problem ist das Finden von bestimmtem Output/Prompts in der "Ausgabe" vom Pseudo-Terminal, da man nicht weiss, wann das Terminal seine "Ausgabe beendet" hat, und man ueber einen shell-Prompt im Allgemeinen auch nur weiss, dass er wahrscheinlich mit "> ", "$ " oder "# " aufhoert. Deswegen setzte ich nach dem Einloggen den Prompt auf einen leicht zu identifizierenden String und die Sprache auf Englisch (um zum Beispiel die Ausgabe deutscher Fehlermeldungen zu vermeiden).

Somit bleibt als groesstes Problem das Einloggen selbst. Um also den Prompt nach dem Einloggen zu finden (oft wird ja noch ziemlich viel Kram ausgegeben, bis man den Prompt erhaelt), setze ich ein echo "eindeutiger string" ab und suche nach eben diesem String. Von da an sollte dann der richtige Prompt leicht zu finden sein.

ssh benoetigt uebrigens nur zum Abfragen des Passwortes ein Pseudo-Terminal. Wenn man also mit Schluesseln arbeitet oder ssh so konfiguriert, dass es ein X-Programm (ask-passwd) fuer die Passworteingabe bei fehlendem controlling terminal benutzt wird, kann man sich den ganzen pty-Kram sparen und statt dessen mit popen arbeiten. ;-)


Aktuelle Version vom 29.09.2006:
ssh.py

Ein Testprogramm: (Achtung, Benutzung auf eigene Gefahr!!! Am besten vorher gucken, was das Programm macht!)
ssh_test.py
Zuletzt geändert von Rebecca am Freitag 29. September 2006, 08:52, insgesamt 1-mal geändert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Montag 25. September 2006, 13:01

Nach einiger Zeit Pause hab nochmal ein paar Kleinigkeiten verbessert und Bugs gejagd. Ausserdem habe ich den Code mal aus dem Forum ausgelagert, damit man mal wieder in diesem Thread posten kann. :)

Auf einer AIX-Machine mit Python 2.2.0 hatte ich das Problem, dass ssh aus irgendeinem Grund das pty nicht als Terminal anerkennt und stattdessen versucht, ssh-askpass zu starten. Das scheint aber nichts zu sein, worauf ich in irgendeiner Weise Einfluss nehmen koennte. :roll: Ich hoffe mal, dass das kein allgemeines Problem bei AIX ist, leider habe ich keine anderen AIXe zur Verfuegung.

So, dann werde ich mich jetzt daranmachen, mein Modul auch mal richtig zu benutzen...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Montag 25. September 2006, 20:10

Hoi Rebecca,

sehr schönes Modul (jedenfalls nach dem ersten drüberfliegen). Ich könnte mir durchaus vorstellen es zu verwenden.

Gruß,
Christian

PS Python ist nicht C/C++ - es braucht keine ; am Ende eines Statements. Im Gegenteil: Es deutet in Python ja nun an, das noch ein Statement in der Zeile folgt. Das ist meist schlechter Stil und unerwünscht.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 29. September 2006, 09:15

CM hat geschrieben:PS Python ist nicht C/C++ - es braucht keine ; am Ende eines Statements.
Weiss ich doch. Ich programmiere neben Python allerdings auch Java und C, und ich kann einfach nicht erfolgreich zwischen Mit-Semikolon-Modus und Ohne-Semikolon-Modus hin- und herschalten. Da waren meine Entwickler irgendwie schlampig, und Bugreports werden ignoriert... :wink:

Update:

Ich habe nochmal die zu erwartenden Fehlermeldungen angepasst, ausserdem die Attributsnamen der Fehlerklassen, sodass sie jetzt zu den EnvironmenErrors passen.

Dann habe ich festgestellt, dass es gar nicht reicht, nur eine Zeile einzulesen um das Echo eines Kommandos zu erhalten, denn lange Kommandos werden natuerlich umgebrochen. Nachdem ich erfolglos versucht habe, das Echo abzuschalten, bin ich jetzt dazu uebergegegangen, das Kommando einfach nochmal via "expect" zu lesen, wobei natuerlich irgendwo sowas wie "\r", "\n" oder sogar Leerzeichen dazugekommen sind... Deswegen hat expect() jetzt einen "ignore"-Parameter verpasst gekommen, sodass man beim Lesen einzelne Zeichen "wegschmeissen" kann.

Ausserdem gibt es eine Klasse analog zu file, die auf Dateien auf remote hosts zugreift. Dazu wird die Datei erst per scp auf den lokalen Rechner kopiert, dann ganz normal geoeffnet und beim Schliessen wieder zurueckkopiert.

Todo:

Ich weiss noch gar nicht, was genau passiert, wenn man sich mit Schluesseln statt Passwoertern einloggen will. Ausserdem sollte man den ssh-port angeben koennen.

Mit Umlauten in Dateinamen habe ich mich auch noch nicht befasst, das ist aber fuer mich erstmal nicht von Bedeutung.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 4. Oktober 2006, 07:56

Gerade gefunden:
"pure python implementation of an ssh proxy"
http://cheeseshop.python.org/pypi/sshproxy/

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten