使用Python捕获sshtunnel异常

时间:2017-07-24 13:53:54

标签: 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],
            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())< / p>

你对如何做到这一点有任何线索吗?

谢谢!

卢卡斯

1 个答案:

答案 0 :(得分: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.expect包裹try|except就可以了。所以我现在......

        try:
            i = self.tn.expect(PROMPT_LOGIN, TIME_LOGIN)
        except:
            quit()

......在可达性问题的情况下,我可以把它赶上去。

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

谢谢!

卢卡斯