Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.3 telnet问题_Python_Python 3.x_Telnet - Fatal编程技术网

Python 3.3 telnet问题

Python 3.3 telnet问题,python,python-3.x,telnet,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:

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

没什么

设置日志文件
不是telnet协议的一部分,它是针对您最喜爱的telnet客户端的命令。现在您正在使用telnet客户端的另一个实现,它没有这样的命令(没有理由尝试将其发送到远程系统)

据我所知,python的
telnetlib
中没有内置的日志记录功能可作为替代

设置日志文件
不是telnet协议的一部分,它是针对您最喜爱的telnet客户端的命令。现在您正在使用telnet客户端的另一个实现,它没有这样的命令(没有理由尝试将其发送到远程系统)


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

您将对此进行反向操作。我假设您正在尝试将其记录到一个文件中,以便您可以将其读入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()

你是在倒退。我假设您正在尝试将其记录到一个文件中,以便您可以将其读入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()

实际上,我的目标是提取文件。python中的其他任何东西都不需要它。我想我的问题是,如果我在windows命令提示符下运行,我可以在几秒钟内得到一个日志文件。当我使用python时,可能需要10分钟以上的时间。我正在编写一个脚本,以便为不了解telnet的同事自动化这个过程。出于好奇,我运行了一个数据包嗅探器,它似乎在一件事情上挂了一阵子。不知道为什么python会出现这种情况。更新:我在你第二个建议的while循环中添加了一个打印项,以查看发生了什么。它似乎可以很好地处理快速出现的重复语句。在我假设的文件末尾,最后一个print语句被打印出来,然后脚本在完成之前挂起5-10分钟。知道这是什么原因吗?它所在的行是output=session.read_some()在循环中。谢谢。可能另一端在该命令执行后并没有释放连接,它只是在几分钟后超时。您还可以使用其他
Telnet
方法进行非阻塞读取并设置自己的较短超时。或者,您也可以发送自己的注销命令(如果是UNIX主机,请尝试发送
command2;注销
,而不是只发送
command2
)。我更改了代码,在读取数据之后(写入之前)立即结束telnet会话,现在所用的时间与正常情况下一样长。一切都很好。谢谢你的帮助!实际上,我的目标是提取文件。python中的其他任何东西都不需要它。我想我的问题是,如果我在windows命令提示符下运行,我可以在几秒钟内得到一个日志文件。当我使用python时,可能需要10分钟以上的时间。我正在编写一个脚本,以便为不了解telnet的同事自动化这个过程。出于好奇,我运行了一个数据包嗅探器,它似乎在一件事情上挂了一阵子。不知道为什么python会出现这种情况。更新:我在你第二个建议的while循环中添加了一个打印项,以查看发生了什么。它似乎可以很好地处理快速出现的重复语句。在我假设的文件末尾,最后一个print语句被打印出来,然后脚本在完成之前挂起5-10分钟。知道这是什么原因吗?它所在的行是output=session.read_some()在循环中。谢谢。可能另一端在该命令执行后并没有释放连接,它只是在几分钟后超时。您还可以使用其他
Telnet
方法进行非阻塞读取并设置自己的较短超时。或者,您也可以发送自己的注销命令(如果是UNIX主机,请尝试发送
command2;注销
,而不是只发送
command2
)。我更改了代码,在读取数据之后(写入之前)立即结束telnet会话,现在所用的时间与正常情况下一样长。一切都很好。谢谢你的帮助!