用Python捕获sshtunnel异常

用Python捕获sshtunnel异常,python,exception,paramiko,ssh-tunnel,telnetlib,Python,Exception,Paramiko,Ssh Tunnel,Telnetlib,我有一个python代码,它打开到远程服务器的SSH连接,进一步将telnet流量转发到隐藏在该服务器后面的几个路由器,以便远程管理这些路由器。代码如下: def sshStart(self): try: self.sshServer = SSHTunnelForwarder( (SRVR_IP, SRVR_PORT), ssh_username = SRVR_USER[0],

我有一个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()

你对如何做到这一点有什么线索吗

谢谢


Lucas

因此,捕获异常的问题在代码的后期阶段得到了解决

触发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 |包装
tn.expect
,但
成功了。所以现在我有

        try:
            i = self.tn.expect(PROMPT_LOGIN, TIME_LOGIN)
        except:
            quit()
。。。在可达性问题的情况下,我可以在那里找到它

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

谢谢


Lucas

我感觉重要的代码仍然缺失,因为这只是两个函数定义,从实际显示的错误消息中,从未出现异常。Hi@Uvar:是的,的确如此。代码很长,这就是为什么我没有发布完整的代码。然而,在再次查看代码后,我发现了错误。我会把它作为答案贴出来。谢谢