如何在python telnetlib中禁用telnet回声?

chm*_*rli 4 python telnet echo

嗨,我知道我应该发送“ 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()
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

您发送的序列错误:

# diable echo here
tn.write(telnetlib.IAC + "\n")
tn.write(telnetlib.DONT + " " + telnetlib.ECHO + "\n")
Run Code Online (Sandbox Code Playgroud)

THE IAC DONT ECHO以三个字节发送,没有任何填充,空格或换行符。因此,请尝试以下操作:

tn.write(telnetlib.IAC + telnetlib.DONT + telnetlib.ECHO)
Run Code Online (Sandbox Code Playgroud)

但是,实际上关闭回声可能还不够。实际上,最常用的解决方案是说将执行回显,这将使另一端停止执行回显:

tn.write(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
Run Code Online (Sandbox Code Playgroud)

编辑:阅读telnetlib手册页后,我看到该write功能将:

将一个字符串写入套接字,将所有IAC字符加倍。

因此,使用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)
Run Code Online (Sandbox Code Playgroud)

  • 在对调试输出进行大量实验和分析之后,我得出结论,我一直试图与 telnetlib 对话的 telnetd 不支持禁用其 ECHO。不幸的是,WILL ECHO 或 DONT ECHO 或任何类似的组合都没有效果,除了服务器告诉我做相反的事情。我要说的是即使使用 get_socket() 方法(它确实回答了问题),人们可能会发现实际上禁用回声没有成功。:-( (2认同)