1

我一直在疯狂地试图完成这项工作。我想从 python 收集一个 telnet 日志。在普通的 telnet 上,我只需打开 telnet 并使用:

set logfile test.xml

问题是使用 python 我无法弄清楚如何首先传递这个命令。当我运行这个

try:
    tn = telnetlib.Telnet()
    tn.write(b"set logfile test.xml" + b"\r")
    tn.open(IP, 223, 8192)
except socket.timeout:
    print ("socket timeout")
    sulk()

我收到此错误:

Traceback (most recent call last):
  File "C:xxxxxxxx.py", line 18, in <module>
    tn.write(b"set logfile test.xml" + b"\r")
  File "C:\Python33\lib\telnetlib.py", line 282, in write
    self.sock.sendall(buffer)
AttributeError: 'NoneType' object has no attribute 'sendall'

如果我在不设置日志文件的情况下打开 IP/端口,脚本运行良好。为了解决我使用 python 写入文件的问题。但由于某种原因,这需要很长时间 5 分钟以上。如果我只是通过 telnet 运行命令,则需要不到 10 秒...

telnet
set logfile test.xml
o xxx.xxx.xxx.xxx xxx
>>commandx
>>commandy

All the data I need is here and in the log file 

那么在打开 IP/端口之前我可以做些什么来设置日志文件吗?提前致谢!

4

2 回答 2

3

你这是在倒退。我假设您正在尝试将其记录到文件中,以便您可以将其读入 Python 脚本并对其进行处理。您应该做的是在变量中捕获 telnet 会话的输出。然后你可以进一步处理它,如果你愿意,甚至可以将它写入文件,等等。

import telnetlib

host    = "host.example.com"
port    = 223
timeout = 9999

try:
    session = telnetlib.Telnet(host, port, timeout)
except socket.timeout:
    print ("socket timeout")
else:
    session.write("command1\n")
    session.write("command2\n")
    output = session.read_all()
    # output now contains the text you want
    # so now you can do something with it:
    with open("test.xml", "w") as logfile:
        logfile.write(output)

如果输出可能很大,您可以分块读取它:

import time, telnetlib

host    = "host.example.com"
port    = 223
timeout = 9999

try:
    session = telnetlib.Telnet(host, port, timeout)
except socket.timeout:
    print ("socket timeout")
else:
    session.write("command1\n")
    session.write("command2\n")
    with open("test.xml", "w") as logfile:
        output = session.read_some()
        while output:
            logfile.write(output)
            time.sleep(0.1)  # let the buffer fill up a bit
            output = session.read_some()
于 2013-01-25T21:59:16.190 回答
2

没有。

set logfile不是 telnet 协议的一部分,它是您最喜欢的 telnet 客户端的命令。现在您正在使用telnet 客户端的另一个实现,它没有这样的命令(没有理由尝试将其发送到远程系统)。

据我所知,python 中没有内置的日志记录工具telnetlib可以推荐作为替代品。

于 2013-01-25T20:44:56.743 回答