4

こんにちは、「IAC DONT ECHO」メッセージを送信する必要があることはわかっていますが、telnetlib を使用してそれを行うにはどうすればよいですか?? ここに私のテストがありますが、うまくいきません。

 #!/usr/bin/env python2
 u"""test"""
 # -*- coding: utf-8 -*-

 import sys
 import telnetlib
 import time

 HOST = "10.10.5.1"
 tn = telnetlib.Telnet(HOST, timeout=1)
 tn.read_until("login: ")
 tn.write("login\n")
 tn.read_until("Password: ")
 tn.write("pass\n")

 print "###########"
 time.sleep(0.5)
 print tn.read_very_eager()

 tn.write("ls /\n")
 time.sleep(0.5)
 print tn.read_very_eager()

 # diable echo here
 tn.write(telnetlib.IAC + "\n")
 tn.write(telnetlib.DONT + " " + telnetlib.ECHO + "\n")
 time.sleep(0.5)
 print tn.read_very_eager()

 tn.write("ls /\n")
 time.sleep(0.5)
 print tn.read_very_eager()

 print "########### exit"
 tn.write("exit\n")
 print tn.read_all()
4

3 に答える 3

6

シーケンスを間違って送信しています:

# diable echo here
tn.write(telnetlib.IAC + "\n")
tn.write(telnetlib.DONT + " " + telnetlib.ECHO + "\n")

THEIAC DONT ECHOは、パディング、スペース、または改行なしで 3 バイトとして送信されます。代わりにこれを試してください:

tn.write(telnetlib.IAC + telnetlib.DONT + telnetlib.ECHO)

ただし、実際にはエコーをオフにするだけでは不十分な場合があります。最も一般的に使用される解決策は、実際には、エコーを行うことを伝えることです。これにより、相手側のエコーが停止します

tn.write(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)

編集:telnetlibのマニュアルページを読んだ後、write関数が次のようになることがわかりました:

IAC 文字を 2 倍にして、ソケットに文字列を書き込みます。

したがって、Telnet オブジェクトwrite関数を使用してこれらのシーケンスを送信しても機能しません。ソケットを取得し、それを使用してシーケンスを書き込む必要があります。

def write_raw_sequence(tn, seq):
    sock = tn.get_socket()
    if sock is not None:
        sock.send(seq)

write_raw_sequence(tn, telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
于 2012-09-14T09:45:27.550 に答える
1

現在の状態では、telnetlib.py を使用して telnet エコーを無効にすることはできません。

telnetlib.py は IAC コマンドに自動的に応答します。(telnetlib.process_rawq() を参照してください) 残念ながら、これは単純な実装であり、受信した要求に否定的に応答するだけです。接続すると、リモート エンドは IAC WILL ECHO を送信し、エンドは IAC DONT ECHO で応答します。(これは、telnetlib.py で DEBUGLEVEL を 1 に設定してコードを実行することで確認できます)。問題は、他のコマンドが正しく処理されていない可能性があります。

以下の手順に従って、制御応答を完全に制御できるように telnetlib.py を変更できます。ただし、正しく応答するには、telnet プロトコルに関する十分な知識が必要です。

telnetlib.py の 440 行目を次のように設定して、自動応答を無効にする必要があります。

if c != IAC:

if c:

次に、289 ~ 290 行をコメントアウトして、IAC シンボルの二重化を無効にします。

if IAC in buffer:
    buffer = buffer.replace(IAC, IAC+IAC)

それが完了すると、IAC WILL ECHO を送信する方法の次の例が機能します。

tn.write(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
于 2015-01-08T23:51:37.413 に答える
1

telnet-server は、私が試みていたものと同じように、あなたの telnet-requests を無視するだけかもしれません。ただし、少なくとも telnet サーバーが独自に初期 IAC コマンドを送信する場合は、実際に telnetlib コードを編集する必要はありません。少なくとも python 3.5 では、telnetlib は IAC コマンドを処理するためのコールバックを提供します。telnet 回線の長さのネゴシエーションに関する Stackoverflow の回答を参照してください。つまり、telnetlib が既に行っているのと同じことを行うコールバックをインストールするには、次のようにします。

import telnetlib
from telnetlib import DO, DONT, IAC, WILL, WONT


def telnet_option_negotiation_cb(tsocket, command, option):
    """
    :param tsocket: telnet socket object
    :param command: telnet Command
    :param option: telnet option
    :return: None
    """
    if command in (DO, DONT):
        print("CB-send: IAC WONT " + str(ord(option)))
        tsocket.sendall(IAC + WONT + option)
    elif command in (WILL, WONT):
        print("CB-send: IAC DONT " + str(ord(option)))
        tsocket.sendall(IAC + DONT + option)

telnetlib.DEBUGLEVEL = 1
tn = telnetlib.Telnet("192.your.ip.here")
tn.set_option_negotiation_callback(telnet_option_negotiation_cb)

...

このコードは telnetlib のデバッグ レベルを設定し、コールバック応答を出力します。これにより、telnet サーバーでの変換の適切な出力が得られます。これで、telnet_option_negotiation_cb() で指定されたオプションをチェックし、標準の回答の代わりにカスタムの回答を提供することで、ECHO などの回答を変更できます。すなわち:

if option == telnetlib.ECHO:
    print("CB-send: IAC WILL ECHO")
    tsocket.sendall(IAC + WILL + option)
    print("CB-send: IAC DONT ECHO")
    tsocket.sendall(IAC + DONT + option)
于 2016-12-20T10:33:30.820 に答える