2017-07-24 3 views
0

J'ai un code python qui amène une connexion SSH au serveur distant pour rediriger le trafic telnet vers plusieurs routeurs cachés derrière ce serveur, afin de les gérer à distance. Le code est le suivant:Catch sshtunnel exception avec 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() 

Cela fonctionne très bien. En effet, je peux facilement gérer plusieurs routeurs avec ce code, à condition qu'il y ait une mise en réseau vers le routeur distant. Le problème survient lorsque le routeur distant (en d'autres termes, la combinaison 127.0.0.1:self.localPort -> self.systemIP, 23) n'est pas accessible à cause de quelque chose (timeout, pas de routage disponible, etc ...).

Dans ce cas, je reçois l'erreur suivante:

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 

Même si l'erreur est correcte (il n'y a en fait pas joignabilité au routeur distant) Je ne peux pas attraper cette erreur: le programme python est bloqué là pour toujours et je ne peux pas le quitter correctement (par exemple: if error -> quit())

Avez-vous la moindre idée sur la façon d'accomplir cela?

Merci!

Lucas

+1

J'ai le sentiment que le bit important du code est toujours porté disparu, car ceux-ci ne sont que 2 définitions de fonction dans laquelle des messages d'erreur réels indiqués, l'exception est jamais augmentée. – Uvar

+0

Salut @Uvar: oui, en effet. Le code est long, c'est pourquoi je ne l'ai pas posté complet. Cependant, après avoir regardé le code à nouveau, j'ai trouvé l'erreur. Je l'afficherai comme une réponse. Merci! –

Répondre

0

Ainsi, la question de la capture à l'exception a été résolu à un stade ultérieur dans le code.

Après le déclenchement de la connexion telnet ...

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

... j'attends la ficelle avant de continuer.

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

Pour une raison quelconque, je pensais que l'inclusion try | except lors de la création de la connexion tn suffisait. Mais non, j'ai continué à recevoir l'erreur SSH mentionnée.

Envelopper le tn.expect avec try|except a fait l'affaire. Alors maintenant j'ai ...

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

... et dans le cas de problèmes d'accessibilité, je peux l'attraper là-haut.

Je ne sais pas si cela est plus façon élégante/droit de le faire, mais au moins travaille ...

Merci!

Lucas