2017-07-24 5 views
0

Ich habe einen Python-Code, der eine SSH-Verbindung zum Remote-Server bringt weiter Telnet-Verkehr zu mehreren Routern hinter diesem Server weitergeleitet, um diese remote zu verwalten. Der Code ist folgender:Catch sshtunnel Ausnahme mit Python

def sshStart(self): 
    try: 
     self.sshServer = SSHTunnelForwarder(
      (SRVR_IP, SRVR_PORT), 
      ssh_username    = SRVR_USER[0], 
      ssh_password    = SRVR_USER[1], 
      remote_bind_address  = (self.systemIP, 23), 
      local_bind_address   = ("127.0.0.1", self.localPort) 
     ) 
     self.sshServer.start() 
    except: 
     fncPrintConsole(self.strConn + "Error SSH Tunnel") 
     self.quit() 


def routerLogin(self): 
    try: 
     self.tn = telnetlib.Telnet("127.0.0.1",self.localPort) 
    except: 
     fncPrintConsole(self.strConn + "No route to host!") 
     self.quit() 

Das funktioniert sehr gut. In der Tat kann ich mehrere Router mit diesem Code problemlos verwalten, vorausgesetzt, es gibt eine Netzwerkverbindung zum fernen Router.

Das Problem tritt auf, wenn der Remote-Router (mit anderen Worten, die Kombination 127.0.0.1:self.localPort -> self.systemIP, 23) wegen etwas nicht erreichbar ist (Timeout, kein Routing, etc ...).

In einem solchen Fall, bekomme ich folgende Fehlermeldung:

2017-07-24 10:38:57,409| ERROR | Could not establish connection from ('127.0.0.1', 50000) to remote side of the tunnel 
2017-07-24 10:38:57,448| ERROR | Secsh channel 0 open FAILED: Network is unreachable: Connect failed 

Auch wenn der Fehler korrekt ist (es gibt tatsächlich keine Erreichbarkeit an den Remote-Router) Ich kann nicht diesen Fehler fangen: das Python-Programm stecken bleibt dort für immer und ich kann es nicht richtig verlassen (zB: if error -> quit())

Haben Sie eine Ahnung, wie dies zu erreichen ist?

Danke!

Lucas

+1

Ich habe das das wichtige Stück Code immer noch das Gefühl fehlt, da diese nur 2 Funktionsdefinitionen sind, in denen von den tatsächlichen Fehlermeldungen angezeigt, wird die Ausnahme nie ausgelöst. – Uvar

+0

Hallo @Uvar: Ja, tatsächlich. Der Code ist lang, deshalb habe ich ihn nicht komplett ausgefüllt. Nachdem ich jedoch den Code erneut angesehen habe, habe ich den Fehler gefunden. Ich werde es als Antwort posten. Vielen Dank! –

Antwort

0

Also, die Frage, die Ausnahme von Fang wurde zu einem späteren Zeitpunkt innerhalb des Codes gelöst.

Nach Auslösen der Telnet-Verbindung ...

def routerLogin(self): 
    try: 
     self.tn = telnetlib.Telnet("127.0.0.1",self.localPort) 
    except: 
     fncPrintConsole(self.strConn + "No route to host!") 
     self.quit() 

... ich eine Schnur erwarten, bevor Sie fortfahren.

i = self.tn.expect(PROMPT_LOGIN, TIME_LOGIN) 

Aus irgendeinem Grund dachte ich, dass try | except auch wenn die tn Verbindung genug war, zu schaffen. Aber nein, ich erhielt den erwähnten SSH-Fehler weiter.

Das Einwickeln der tn.expect mit try|except tat den Trick. So, jetzt habe ich ...

 try: 
      i = self.tn.expect(PROMPT_LOGIN, TIME_LOGIN) 
     except: 
      quit() 

... und im Fall von Erreichbarkeitsproblemen kann ich es dort aufholen.

Sie wissen nicht, ob dies der elegantere/richtige Weg, es zu tun ist, aber zumindest funktioniert ...

Dank!

Lucas

Verwandte Themen