我有一个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>
你对如何做到这一点有任何线索吗?
谢谢!
卢卡斯
答案 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()
......在可达性问题的情况下,我可以把它赶上去。
不知道这是否是更优雅/正确的做法,但至少有效......
谢谢!
卢卡斯