使用 Python 捕获 sshtunnel 异常
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)
出于某种原因,我认为在创建 tn
连接时包含 try | except
就足够了。但是没有,我一直收到提到的 SSH 错误。
用 try|except
包装 tn.expect
就成功了。所以现在我有...
try:
i = self.tn.expect(PROMPT_LOGIN, TIME_LOGIN)
except:
quit()
...如果出现可达性问题,我可以在那里解决。
不知道这是不是更优雅/正确的方法,但至少是有效的...
谢谢!
卢卡斯
我有一个 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)
出于某种原因,我认为在创建 tn
连接时包含 try | except
就足够了。但是没有,我一直收到提到的 SSH 错误。
用 try|except
包装 tn.expect
就成功了。所以现在我有...
try:
i = self.tn.expect(PROMPT_LOGIN, TIME_LOGIN)
except:
quit()
...如果出现可达性问题,我可以在那里解决。
不知道这是不是更优雅/正确的方法,但至少是有效的...
谢谢!
卢卡斯