Поймать исключение sshtunnel с 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())

Есть ли у вас какие-либо подсказки, как этого добиться?

Спасибо!

Лукас

1 ответ

Решение

Таким образом, проблема отлова исключения была решена на более позднем этапе кода.

После запуска соединения 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()

... и в случае проблем с достижимостью я могу это уловить.

Не знаю, если это более элегантный / правильный способ сделать это, но по крайней мере работает...

Спасибо!

Лукас

Другие вопросы по тегам