【问题标题】:How to print telnet response line by line?如何逐行打印telnet响应?
【发布时间】:2015-02-27 12:36:35
【问题描述】:

当通过 telnet 执行的命令继续通过控制台响应时,是否可以逐行打印 telnet 响应?

示例:我执行了一个命令(收集日志),它一直在控制台窗口上显示日志。我们可以逐行阅读回复并打印出来,而不会遗漏任何一行吗?

sn -p 下面写入日志,但仅在某个指定时间之后。如果我在两者之间停止服务/脚本(CTRL-C),那不会写任何东西。

import sys
import telnetlib
import time


orig_stdout = sys.stdout
f = open('outpuy.txt', 'w')
sys.stdout = f

try:
        tn = telnetlib.Telnet(IP)
        tn.read_until(b"pattern1")
        tn.write(username.encode('ascii') + b"\n")
        tn.read_until(b"pattern2")
        tn.write(command1.encode('ascii') + b"\n")
        z = tn.read_until(b'abcd\b\n',600)
        array = z.splitlines( )
except:
        sys.exit("Telnet Failed to ", IP)

for i in array:
        i=i.strip()
        print(i)

sys.stdout = orig_stdout
f.close()

【问题讨论】:

  • 您将输出定向到 f 那么您认为如何将其打印到屏幕上?
  • 目前使用 telnet 我观察到使用read_until 存在将未读字节留在 telnet 缓冲区中的危险。人们往往会忘记这些。例如。在上面的示例中,我们在“pattern1”处停止读取,如果缓冲区中“pattern1”之后仍有字节,我们将首先发送用户名,然后读取“pattern1”之后的字节直到“pattern2”,所以我们依赖事实上,“pattern1”实际上是在缓冲区的末尾。它继续每个read_until 也可以读取从read_untilbefore 剩余的字节。这样可能会丢失 telnet 响应。

标签: python telnet telnetlib


【解决方案1】:

您可以在循环中使用tn.read_until("\n"),以便在执行 telnet 命令时读取一行

while True:
    line = tn.read_until(b"\n")  # Read one line
    print(line)
    if b'abcd' in line:  # last line, no more read
        break

【讨论】:

  • 谢谢 Secator。这正是我想要的。
【解决方案2】:

您可以使用documentation 中指定的ready_very_eagerread_eagerread_lazyready_very_lazy 函数逐字节读取流。然后,您可以在自己的代码上处理“直到”逻辑,同时将读取的行写入控制台。

【讨论】:

  • read_very_eager 和 read_eager 都打印 telnet 响应和 ' ' ,这是不需要的。如果没有可用的熟数据,则两者都打印 ' ' 。 read_lazy 和 read_very_lazy 都只打印 ' ' 。
  • 我认为这个答案被低估了,因为read_until 只有在你知道会发生什么的情况下才合适。此外,它还有将未读数据留在 telnet 队列中的危险,这会干扰下一轮读取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多