Имеется 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.
Возможно telnetlib использует режим telnet-а, не поддерживаемый коммутатором, но это вряд ли. Если повторить блок кода с вводом логина пароля, то таки все работает. Охото разобраться, но с наскоку не получается.