Найти - Пользователи
Полная версия: telnetlib, D-Link и согласование
Начало » Network » telnetlib, D-Link и согласование
1
exhalace
Приветствую.

Имеется DGS-3627G, у которого телнет не хочет дружить c telnetlib.

Тестовый скрипт:
#!/usr/bin/env python2
# ~*~ coding: utf-8 ~*~
import telnetlib
tn = telnetlib.Telnet('172.20.10.18')
tn.set_debuglevel(1)
tn.read_until("UserName:")
tn.write("admin\r")
tn.read_until("PassWord:")
tn.write("Pa$$w0rd\r")
tn.read_until("#")
tn.write("logout\r")
tn.close()

На первый взгляд все очень тривиально, но давайте посмотрим дебаг:
Telnet(172.20.10.18,23): recv '\xff\xfd\x03'
Telnet(172.20.10.18,23): IAC DO 3
Telnet(172.20.10.18,23): recv '\xff\xfb\x03\xff\xfb\x01\x1b[0m\x1b[1;1H\x1b[2J\n\r                      DGS-36'
Telnet(172.20.10.18,23): IAC WILL 3
Telnet(172.20.10.18,23): IAC WILL 1
Telnet(172.20.10.18,23): recv '27G Gigabit Ethernet Switch\n\r                     '
Telnet(172.20.10.18,23): recv '       Command Line Interface\n\r\n\r                 '
Telnet(172.20.10.18,23): recv '          Firmware: Build 2.82.B23\n\r           Cop'
Telnet(172.20.10.18,23): recv 'yright(C) 2010 D-Link Corporation. All rights rese'
Telnet(172.20.10.18,23): recv 'rved.\n\rUserName:'
Telnet(172.20.10.18,23): send 'admin\r'
Telnet(172.20.10.18,23): recv '\xff\xfe\x03'
Telnet(172.20.10.18,23): IAC DONT 3
Telnet(172.20.10.18,23): recv '\xff\xfc\x03'
Telnet(172.20.10.18,23): IAC WONT 3
Telnet(172.20.10.18,23): recv '\xff\xfc\x01admin\n\rPassWord:'
Telnet(172.20.10.18,23): IAC WONT 1
Telnet(172.20.10.18,23): send 'Pa$$w0rd\r'
Telnet(172.20.10.18,23): recv '*'
Telnet(172.20.10.18,23): recv '*'
Telnet(172.20.10.18,23): recv '********\n\rFail!\n\rUserName:'
Тут мы видим что согласующие последовательности попадают в пользовательский ввод какого-то лешего, и явно что-то лишнее отсылается в качестве пароля.

Пробуем через библиотеку pexpect
#!/usr/bin/env python2
# ~*~ coding: utf-8 ~*~
import sys
import pexpect
switch_ip = '172.20.10.18'
p = pexpect.spawn('telnet %s' % switch_ip, timeout=2)
p.logfile=sys.stdout
p.expect('UserName:')
p.sendline('admin')
p.expect('PassWord:')
p.sendline('Pa$$w0rd')
p.expect('#')
p.sendline('logout')
p.close()
Вывод
                      DGS-3627G Gigabit Ethernet Switch
                            Command Line Interface
                           Firmware: Build 2.82.B23
           Copyright(C) 2010 D-Link Corporation. All rights reserved.
UserName:admin
admin
PassWorda$$w0rd
********
DGS-3627G:admin#logout
Видно, что все работает. То есть через нативный телнет все согласуется. Давайте посмотрим, что же там происходит:
$ telnet
telnet> toggle options
Will show option processing.
telnet> open 172.20.10.18
Trying 172.20.10.18...
Connected to 172.20.10.18.
Escape character is '^]'.
SENT DO SUPPRESS GO AHEAD
SENT WILL TERMINAL TYPE
SENT WILL NAWS
SENT WILL TSPEED
SENT WILL LFLOW
SENT WILL LINEMODE
SENT WILL NEW-ENVIRON
SENT DO STATUS
SENT WILL XDISPLOC
RCVD DO SUPPRESS GO AHEAD
SENT WILL SUPPRESS GO AHEAD
RCVD WILL SUPPRESS GO AHEAD
RCVD WILL ECHO
SENT DO ECHO
                      DGS-3627G Gigabit Ethernet Switch
                            Command Line Interface
                           Firmware: Build 2.82.B23
           Copyright(C) 2010 D-Link CorpRCVD DONT TERMINAL TYPE
RCVD DONT NAWS
RCVD DONT TSPEED
RCVD DONT LFLOW
RCVD DONT LINEMODE
RCVD DONT NEW-ENVIRON
RCVD WONT STATUS
RCVD DONT XDISPLOC
oration. All rights reserved.
UserName:admin
PassWord:********
DGS-3627G:admin#
DGS-3627G:admin#logout
Command: logout
**********
* Logout *
**********
Connection closed by foreign host.
Конечно же я могу не ждать приглашения к вводу логина и пароля, а просто их отсылать, после чего уже ожидать промта самого CLI длинка. Но мне очень интересно данное поведение, поскольку совсем непонятно как могут нечто лишнее попадать в пользовательский ввод.
Возможно telnetlib использует режим telnet-а, не поддерживаемый коммутатором, но это вряд ли. Если повторить блок кода с вводом логина пароля, то таки все работает. Охото разобраться, но с наскоку не получается.
noob_saibot
Да было такое поведение замечено за ДГСами (решил использованием plink из комплекта putty), на ДЕСах все нормально работает. Кажется мне, что тут бага самого D-linka, поскольку на всех других устройствах для которых пользовал telnetlib все было в порядке. Друг тоже проделывал с ДГС, но на cpp, наблюдал похожее поведение.

PS. Если разберётесь, отпишите, самому интересно.
PooH
Вот эту ветку смотрели?
exhalace
PooH
Вот эту ветку смотрели?
Смотрел, но некропостить не стал.
Дампы трафика подтверждают, что на пользовательский ввод попадают лишние символы, которые отображаются на железке эхом в виде дополнительных звездочек. Саму либу пока не трейсил, не было времени. Временно ввернул кривой костыль с повторной попыткой авторизации.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB