Поймать исключение 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()
... и в случае проблем с достижимостью я могу это уловить.
Не знаю, если это более элегантный / правильный способ сделать это, но по крайней мере работает...
Спасибо!
Лукас