嗨我知道我应该发送'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()
答案 0 :(得分:5)
您发送的序列错误:
# diable echo here
tn.write(telnetlib.IAC + "\n")
tn.write(telnetlib.DONT + " " + telnetlib.ECHO + "\n")
IAC DONT ECHO
以三个字节发送,没有任何填充,空格或换行符。所以试试这个:
tn.write(telnetlib.IAC + telnetlib.DONT + telnetlib.ECHO)
然而,实际上关闭回声可能还不够。最常用的解决方案实际上就是说你会做回音,这会让另一端停止回音:
tn.write(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
修改:阅读telnetlib manual page后,我发现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)
答案 1 :(得分:1)
在其当前状态下使用telnetlib.py禁用telnet echo是不可能的。
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的示例将使ECHO正常工作
tn.write(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
答案 2 :(得分:0)
可能是telnet-server忽略了你的telnet请求,就像我试图反对的那样。然而,实际上不需要实际编辑telnetlib代码,至少如果telnet-server确实在其上发送了初始IAC命令。至少在python 3.5中,telnetlib提供了一个回调来处理IAC命令。见Stackoverflow answer on negotiating telnet line length。即:安装一个与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 debuglevel并打印回调应答,这为您提供了使用telnet-server进行转换的良好输出。现在,您可以通过检查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)