2017-07-24 68 views
0

我有一个python代码,它启动一个到远程服务器的SSH连接,以进一步将telnet流量转发到隐藏在此服务器后面的几个路由器,以便远程管理这些流量。代码如下:用Python捕获sshtunnel异常

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() 

这是工作非常好。的确,我可以用这个代码轻松地管理几台路由器,前提是有远端路由器的网络。

当远程路由器(换句话说,组合127.0.0.1:self.localPort -> self.systemIP, 23)由于某些事情(超时,无路由可用等)而无法到达时,会出现此问题。

在这种情况下,我得到以下错误:

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 

尽管这些错误是正确的(实际上有没有可达远程路由器)我不能赶上这个错误:Python程序卡住有永远,我不能退出它正确(即:if error -> quit()

你有任何线索如何做到这一点?

谢谢!

卢卡斯

+1

我有感觉的代码,最重要的一点是人仍下落不明,因为这些都只是2个函数定义中,从显示的实际错误消息时,异常从未提出。 – Uvar

+0

Hi @Uvar:确实如此。代码很长,这就是为什么我没有发布完成。但是,在再次查看代码后,我发现了这个错误。我会把它作为答案发布。谢谢! –

回答

0

因此,捕捉异常的问题是在代码中后期阶段解决。

触发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() 

...我希望才去上一些字符串。

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

出于某种原因,我认为包括try | except创建tn连接时,就足够了。但是,不,我一直在收到提到的SSH错误。

包装tn.expecttry|except诀窍。所以现在我有...

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

...在可达性问题的情况下,我可以赶上那里。

不知道这是否是做的更优雅/右的方式,但至少是工作...

谢谢!

卢卡斯