如何逐行打印Telnet响应?

7

在telnet执行命令时,当命令一直在控制台上响应时,有可能按行打印telnet响应吗?

例如:我已经执行了一个命令(用于收集日志),它会在控制台窗口上持续显示日志。我们能够逐行读取响应并打印它,而不会错过任何单独的行吗?

下面的代码片段将写日志,但只是在特定的时间后才写入。如果我在中间停止服务/脚本(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,那你认为如何将其打印到屏幕上? - Padraic Cunningham
在使用telnet时,我发现使用read_until存在将未读取的字节留在telnet缓冲区中的危险。人们往往会忘记这些内容。例如,在上面的示例中,我们停止在“pattern1”处读取,如果在缓冲区中仍然有“pattern1”之后的字节,则我们将首先发送用户名,然后读取“pattern1”之后到“pattern2”之间的字节,因此我们依赖于“pattern1”确实在缓冲区的末尾。每个read_until也可能读取上一个read_until剩下的字节。这样一来,我们可能会失去对telnet响应的跟踪。 - avans
2个回答

6

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

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。这正是我想要的。 - Jackie James

2
你可以使用在文档中指定的ready_very_eagerread_eagerread_lazyready_very_lazy函数逐字节读取流。然后,你可以在自己的代码中处理“直到”逻辑并将读取的行写入控制台。请注意保留HTML标签。

read_very_eager和read_eager都会打印出telnet响应以及' ',但这是不必要的。如果没有可用的cooked数据,两者都会打印出' '。read_lazy和read_very_lazy只会打印出' '。 - Jackie James
我认为这个答案被低估了,因为read_until只适用于您知道要期望什么的情况。此外,它有可能在下一轮中干扰性地读取遗留在Telnet队列中的未读数据。 - avans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接