簡體   English   中英

使用Python捕獲sshtunnel異常

[英]Catch sshtunnel exception with 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()

您對如何實現這一目標有任何了解嗎?

謝謝!

盧卡斯

因此,在代碼的稍后階段解決了捕獲異常的問題。

觸發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 try | except創建tn連接時已足夠。 但是,不,我一直收到提到的SSH錯誤。

try|except包裹tn.expect達到目的。 所以現在我有...

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

...並且在可達性問題的情況下,我可以趕上那里。

不知道這是否是更優雅/更正確的方法,但至少在起作用...

謝謝!

盧卡斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM