使用Python检查Telnet是否仍然连接

时间:2016-02-11 01:07:47

标签: python networking telnet telnetlib

我正在编写一个python程序,它使用Telnet每秒发送一次相同的命令,然后读取输出,将其组织成一个Dictionary,然后打印到一个JSON文件(以后读取它)在一个前端web-gui)。这样做的目的是提供关键telnet命令输出的实时更新。

我遇到的问题是,如果连接在程序中途中途丢失,则会导致程序崩溃。我已尝试过多种方法来解决此问题,例如使用布尔值在建立连接时设置为True,如果存在超时错误则设置为False,但这有一些限制。如果连接成功,但稍后断开连接,则尽管连接丢失,布尔值仍将为true。我也找到了一些方法来解决这个问题(例如:如果Telnet命令在5秒内没有返回输出,连接丢失,布尔值更新为False)。

然而,这是一个复杂的程序,似乎有太多可能的方法断开连接可以通过我写的检查滑动,仍然导致程序崩溃。

我希望找到一种非常简单的方法来检查Telnet命令是否已连接。如果只是一行代码,那就更好了。 我目前知道如何检查它是否已连接的唯一方法是尝试重新连接,如果网络连接丢失,这将失败。但是,每次检查以确保连接时,我都不想打开新的telnet连接。如果它已经连接,那是浪费关键时间,并且在你尝试连接之后无法知道它没有连接。

我正在寻找类似的东西:

class cliManager():
    '''
    Class to manage a Command Line Interface connection via Telnet
    '''

    def __init__(self, host, port, timeout):
        self.host = host
        self.port = port
        self.timeout = timeout #Timeout for connecting to telnet
        self.isConnected = False

        # CONNECT to device via TELNET, catch connection errors.
    def connect(self):
        try:
            if self.tn:
                self.tn.close()
            print("Connecting...")
            self.tn = telnetlib.Telnet(self.host, self.port, self.timeout)
            print("Connection Establised")
            self.isConnected  = True
        except Exception: 
            print("Connection Failed")
            self.isConnected  = False

    .
    .
    .

    def sendCmd(self, cmd):
        # CHECK if connected, if not then reconnect
        output = {}
        if not self.reconnect():
            return output

        #Ensure cmd is valid, strip out \r\t\n, etc
        cmd = self.validateCmd(cmd)

        #Send Command and newline
        self.tn.write(cmd + "\n")

        response = ''
        try:
            response = self.tn.read_until('\n*', 5)
            if len(response) == 0:
                print "No data returned!"
                self.isConnected = False 
        except EOFError:
            print "Telnet Not Connected!"
            self.isConnected = False

        output = self.parseCmdStatus(response)

        return output

有什么建议吗?

我正在运行Python 2.6(由于向后兼容性原因无法更新)

编辑:

这是(简略的)代码,说明我目前如何连接到telnet和发送/读取命令。

cli = cliManager("136.185.10.44", 6000, 2)
cli.connect()
giDict = cli.sendCmd('getInfo')
[then giDict and other command results go to other methods where they are formatted and interpreted for the front end user]

... elswhere

<p>…blabla S.King (1987). Bla bla bla J.Doe (2001) blabla bla J.Martin (1995) blabla…</p>

1 个答案:

答案 0 :(得分:1)

您可以尝试以下代码来检查 telnet 连接是否仍然可用。

    def is_connected(self):
        try:
            self.tn.read_very_eager()
            return True
        except EOFError:
            print("EOFerror: telnet connection is closed")
            return False

您还可以参考 https://docs.python.org/3/library/telnetlib.html 了解 Telnet.read_very_eager() 的用法和:

https://lgfang.github.io/computer/2007/07/06/py-telnetlib#:~:text=The%20difference%20is%20that%20read_eager,read%20as%20much%20as%20possible.&text=The%20remaining%20read%20functions%20basically%20block%20until%20they%20received%20designated%20data