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 logfiletelnet プロトコルの一部ではなく、お気に入りの telnet クライアント用のコマンドです。現在、そのようなコマンドを持たない telnet クライアントの別の実装を使用しています (リモートシステムに送信する理由はありません)。

私の知る限り、Pythontelnetlibには、代わりとして推奨される組み込みのロギング機能はありません。

于 2013-01-25T20:44:56.743 に答える