【发布时间】:2019-05-29 19:56:13
【问题描述】:
我目前正在构建一个 python 脚本,用于启用和禁用交换机上的某些端口,以查看交换机将如何操作以达到质量保证目的。我一直在使用一个名为 paramiko 的 Python 库,它实现了 SSH 以连接到我想要的任何设备,我指的是我的一位队友提供的遗留代码来编写更多脚本。在其中一个遗留代码文件中,有一个名为 _run_poll 的函数,我不明白它到底在做什么。
我已经尝试对“轮询”对 SSH 的含义进行一些研究,但我仍然不明白当我们运行“轮询”时会发生什么。它的定义似乎有点模糊。这是函数:
def _run_poll(self, session, timeout, input_data):
interval = 0.1
maxseconds = timeout
maxcount = maxseconds / interval
i = 0
timeout_flag = False
self.info('polling (%d, %d)' % (maxseconds, maxcount))
start = datetime.datetime.now()
start_secs = time.mktime(start.timetuple())
output = ''
session.setblocking(0)
while True:
if session.recv_ready(): # returns true if data has been buffered
data = session.recv(self.bufsize) # receive data from the channel
output += data
self.info('read %d bytes, total %d' % (len(data), len(output)))
if session.send_ready():
# We received a potential prompt.
# In the future this could be made to work more like
# pexpect with pattern matching.
if i < len(input_data):
data = input_data[input_idx] + '\n'
i += 1
self.info('sending input data %d' % (len(data)))
session.send(data)
self.info('session.exit_status_ready() = %s' % (str(session.exit_status_ready())))
if session.exit_status_ready():
break
# Timeout check
now = datetime.datetime.now()
now_secs = time.mktime(now.timetuple())
et_secs = now_secs - start_secs
self.info('timeout check %d %d' % (et_secs, maxseconds))
if et_secs > maxseconds:
self.info('polling finished - timeout')
timeout_flag = True
break
time.sleep(0.200)
self.info('polling loop ended')
if session.recv_ready():
data = session.recv(self.bufsize)
output += data
self.info('read %d bytes, total %d' % (len(data), len(output)))
self.info('polling finished - %d output bytes' % (len(output)))
if timeout_flag:
self.info('appending timeout message')
output += '\nERROR: timeout after %d seconds\n' % (timeout)
session.close()
return output
我找不到很多在线资源来描述这里发生的事情或一般的“投票”。谁能帮我解释一下究竟什么是“投票”以及这里发生了什么?
【问题讨论】:
标签: python networking ssh paramiko polling