在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()
read_until
存在将未读取的字节留在telnet缓冲区中的危险。人们往往会忘记这些内容。例如,在上面的示例中,我们停止在“pattern1”处读取,如果在缓冲区中仍然有“pattern1”之后的字节,则我们将首先发送用户名,然后读取“pattern1”之后到“pattern2”之间的字节,因此我们依赖于“pattern1”确实在缓冲区的末尾。每个read_until
也可能读取上一个read_until
剩下的字节。这样一来,我们可能会失去对telnet响应的跟踪。 - avans