[英]Catch sshtunnel exception with Python
我有一個python代碼,它建立了到遠程服務器的SSH連接,以將telnet流量進一步轉發到隱藏在該服務器后面的多個路由器,以便對它們進行遠程管理。 代碼如下:
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()
)
您對如何實現這一目標有任何了解嗎?
謝謝!
盧卡斯
因此,在代碼的稍后階段解決了捕獲異常的問題。
觸發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
try | except
創建tn
連接時已足夠。 但是,不,我一直收到提到的SSH錯誤。
用try|except
包裹tn.expect
達到目的。 所以現在我有...
try:
i = self.tn.expect(PROMPT_LOGIN, TIME_LOGIN)
except:
quit()
...並且在可達性問題的情況下,我可以趕上那里。
不知道這是否是更優雅/更正確的方法,但至少在起作用...
謝謝!
盧卡斯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.