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

...如果出现可达性问题,我可以在那里解决。

不知道这是不是更优雅/正确的方法,但至少是有效的...

谢谢!

卢卡斯