Python 3.3 telnet问题

时间:2013-01-25 20:39:27

标签: python python-3.x telnet

我一直在疯狂尝试做这项工作。我想从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 /端口之前,我可以做些什么来设置日志文件? 在此先感谢!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

无。

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

据我所知,python的telnetlib中没有内置的日志工具来推荐替代。