我正在编写一个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>
答案 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() 的用法和: