SSH-Verbindung herstellen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
NewPython19

Hallo,

ich möchte mit meinem Windows-PC eine SSH-Verbindung zu einem Linux-Rechner über Python aufbauen. Hierfür verwende ich die Bibliothek "Paramiko" .
In der Paramiko Dokumentation habe ich folgendes Beispiel gefunden:

Code: Alles auswählen

	client = SSHClient()
	client.load_system_host_keys()
	client.connect('ssh.example.com')
	stdin, stdout, stderr = client.exec_command('ls -l')
Dieses habe ich an meine Bedingungen soweit erstmal angepasst:

Code: Alles auswählen

	client = paramiko.SSHClient()
        client.load_system_host_keys()
	try:
        	client.connect(ip, 22, user, password)
        	stdin, stdout, stderr = client.exec_command('ls -l')
        except:
        	print("Error"
Bei mir wird jedes Mal der Fehler (print("Error") angezeigt. Kann mir jemand sagen, ob ich bei den Geräten vorher was einstellen muss bzw. ob ich im Code noch Ergänzungen brauche?
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich kann dir vor allem sagen, dass du den Code verschlimmbessert hast durch dein allumfassendes try/except, der aus einem informativen Fehler ein kümmerliches “error” macht. Schmeiß das raus, und dann wirst du einen Fehler bekommen der entweder schon dir weiterhilft, oder poste ihn hier & wir gucken drauf.
NewPython19

Ok, also ich hab es umgeändert zu:

Code: Alles auswählen

	client = paramiko.SSHClient()
    	client.load_system_host_keys()
   	client.connect(ip, 22, user, password)
        stdin, stdout, stderr = client.exec_command('ls -l')
Ich bekomme nun diesen Fehler:
paramiko.ssh_exception.SSHException: Server "ip" not found in known_hosts
(Ich habe die IP-Adresse in der Fehlermeldung in "ip" umbenannt :wink:)
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und hast du die Fehlermeldung mal gegoogelt?
NewPython19

Habe folgende Änderungen ergänzt:

Code: Alles auswählen

        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        client.load_system_host_keys()
        client.connect(ip, 22, user, password)
        stdin, stdout, stderr = client.exec_command('cd /')
Keine Fehlermeldung und ich kann bspw. den Inhalt des Verzeichnis anzeigen lassen. :wink:
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Durch diese Änderung hast du dir eine Sicherheitslücke eingefangen. Sollte ein Angreifer eine MitM Attacke ausführen, würdest du dessen SSH Host Key akzeptieren ohne auch nur eine Warnung auszugeben.

Du solltest den Host Key von deinem Linux PC auf dem Windows PC in den system host keys speichern statt beliebige host keys zu akzeptieren.
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

@DasIch: außer bei der ersten Verbindung nicht. Womit MIM schon deutlich unwahrscheinlicher wird.
NewPython19

Da ich nur in einem kleinen Rahmen mit meinem Programm arbeite, ist ein Sicherheits Key finde ich ein bisschen überflüssig für den Anfang. Aber ich behalte es mal im Hinterkopf. :wink:

Wie lang bleibt die SSH-Verbindung eigentlich aktiv? Ich mein wenn ich bspw. zu Beginn einer Applikation die Verbindung aufbaue, bleibt die Verbindung während der Dauer/Ausführung der Applikation aktiv oder endet sie bspw. bei Öffnen eines neuen Fensters?
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fenster haben damit nichts zu tun. Sondern die Lebenszeit des Objektes selbst. Und bei Netzwerk kann natürlich prinzipiell immer was schief gehen.
NewPython19

Kann über eine solche SSH-Verbindung auch eine Datei auf dem anderen Rechner ausgeführt werden? Wenn ja, wie?
Benutzeravatar
sparrow
User
Beiträge: 4190
Registriert: Freitag 17. April 2009, 10:28

Du hast doch in deinem Beispiel bereits einen Befehl ausgeführt.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das tust Du doch schon, z.B. mit `ls -l`.
NewPython19

Aber damit kann ich keine Datei z.b. "test.py" ausführen oder?
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@NewPython19: Wenn die ausführbar ist, natürlich. Warum nicht?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wenn es dir darum geht dich mit einem anderen Computer zu verbinden um da Python Code auszuführen, ist vielleicht execnet einen Blick wert. Damit kann man auf einem anderen Computer (z.B. über SSH) einen Interpreter starten und darauf Code ausführen. Execnet nimmt einem damit einiges an Arbeit ab und abstrahiert dass recht nett.
Antworten