2017-07-24 69 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() 

...在可達性問題的情況下,我可以趕上那裏。

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

謝謝!

盧卡斯