Hi I known that I should send 'IAC DONT ECHO' message, but how may I do that using telnetlib??
Here is my test, but it doesn't work.
#!/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()
You are sending the sequence wrong:
# diable echo here
tn.write(telnetlib.IAC + "\n")
tn.write(telnetlib.DONT + " " + telnetlib.ECHO + "\n")
THE IAC DONT ECHO
is sent as three bytes, without any padding, spaces or newlines. So try this instead:
tn.write(telnetlib.IAC + telnetlib.DONT + telnetlib.ECHO)
However, it might not be enough to turn off echo actually. The solution most commonly used is actually to say that you will do the echoing, which will make the other end stop doing echoing:
tn.write(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
Edit: After reading the telnetlib manual page I see that the write
function will:
Write a string to the socket, doubling any IAC characters.
So using the Telnet object write
function will not work sending these sequences, you have to get the socket and use that to write the sequence:
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)
It is impossible to disable telnet echo using telnetlib.py in it's current state.
telnetlib.py automatically responds to IAC commands for you. (See telnetlib.process_rawq()) Unfortunately, it is a simple implementation that just negatively responds to incoming requests. When you connect, the remote end will send IAC WILL ECHO and your end will reply with IAC DONT ECHO. (You can confirm this by setting DEBUGLEVEL to 1 in telnetlib.py and running your code). The issue is likely to be that other commands are not being handled correctly.
You can modify telnetlib.py so as to have full control over the control responses by following the instructions below. However, correctly responding requires sufficient knowledge of the telnet protocol.
You will have to disable the automatic responses by setting line 440 in telnetlib.py from
if c != IAC:
to
if c:
Then disable the doubling of IAC symbol by commenting out line 289-290
if IAC in buffer:
buffer = buffer.replace(IAC, IAC+IAC)
With that done, the following example of how to send IAC WILL ECHO will work
tn.write(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
It might be that the telnet-server just ignores your telnet-requests as is with the one I was trying against. There is no need however to actually edit the telnetlib-code, at least if the telnet-server does send initial IAC-commands on it's own. At least in python 3.5 telnetlib offers to place a callback to handle IAC-commands. See Stackoverflow answer on negotiating telnet line length. I.e.: to install a callback that just does the same as telnetlib does already just do:
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)
...
The code sets the telnetlib debuglevel and prints the callback-answers, this give you a good output of your conversion with the telnet-server. Now you can change your answers i.e. for ECHO by checking the given option in the telnet_option_negotiation_cb() and providing custom answers instead of the standard ones. I.e:
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)