Pexpect and telnet not communicating properly

George Trojan george.trojan at noaa.gov
Tue Jan 27 18:06:52 CET 2009


David Anderson wrote:
> I am trying to automate the following session - to talk to my router:
> 
> =======================
> telnet speedtouch
> Trying 192.168.1.254...
> Connected to speedtouch.
> Escape character is '^]'.
> Username : Administrator
> Password :
> ------------------------------------------------------------------------
> 
>                              ______  SpeedTouch 780
>                          ___/_____/\
>                         /         /\  6.1.7.2
>                   _____/__       /  \
>                 _/       /\_____/___ \  Copyright (c) 1999-2006, THOMSON
>                //       /  \       /\ \
>        _______//_______/    \     / _\/______
>       /      / \       \    /    / /        /\
>    __/      /   \       \  /    / /        / _\__
>   / /      /     \_______\/    / /        / /   /\
>  /_/______/___________________/ /________/ /___/  \
>  \ \      \    ___________    \ \        \ \   \  /
>   \_\      \  /          /\    \ \        \ \___\/
>      \      \/          /  \    \ \        \  /
>       \_____/          /    \    \ \________\/
>            /__________/      \    \  /
>            \   _____  \      /_____\/
>             \ /    /\  \    /___\/
>              /____/  \  \  /
>              \    \  /___\/
>               \____\/
> 
> ------------------------------------------------------------------------
> _{Administrator}=>?
> Following commands are available :
> 
> help             : Displays this help information
> menu             : Displays menu
> ?                : Displays this help information
> exit             : Exits this shell.
> ..               : Exits group selection.
> saveall          : Saves current configuration.
> ping             : Send ICMP ECHO_REQUEST packets.
> traceroute       : Send ICMP/UDP packets to trace the ip path.
> 
> Following command groups are available :
> 
> firewall        service         autopvc         connection      cwmp
> dhcp            dns             dsd             dyndns          eth
> adsl            atm             config          debug           env
> expr            grp             hostmgr         ids             igmp
> interface       ip              ipqos           label           language
> mbus            memm            mlp             nat             ppp
> pptp            script          snmp            sntp            software
> system          systemlog       upgrade         upnp            user
> voice           wireless
> 
> {Administrator}=>exit
> 
> ========================
> 
> I am using the following code:
> 
> #!/usr/bin/env python
> 
> import pexpect
> import sys
> 
> child = pexpect.spawn('telnet 192.168.1.254')
> fout = file('mylog.txt','w')
> child.logfile = fout
> 
> child.expect('sername : ')
> child.sendline('Administrator')
> child.expect('assword : ')
> child.sendline('')
> 
> 
> child.expect('_{Administrator}=>')
> child.sendline('?')
> child.expect('_{Administrator}=>')
> child.expect('exit')
> 
> ========================
> 
> This times out after child.sendline('Administrator')
> 
> mylog.txt contains:
> Trying 192.168.1.254...
> 
> Connected to 192.168.1.254.
> 
> Escape character is '^]'.
> 
> Username : Administrator
> Administrator
> ========================
> 
> Can anyone help me in finding out what I am doing wrong?
> 
> Regards
> David

To debug, add lines

print self.before
print self.after

after each child.expect(). Also, add timeout=2 to the argument list of 
child.expect().

I wrote a thin wrapper that serves me well, at least till now.


class Connection(object):
     '''Establishes connection to Cisco modem server.
A wrapper around fdexpect spawn.
'''
     def __init__(self, host, port, user, passwd, **kwds):
         self.pipe = None
         self.socket = None
         self.host = host
         self.port = port
         self.user = user
         self.passwd = passwd
         self.logger = kwds.get('logger')
         self._last = ''

     def __getattr__(self, name):
         if name not in ['open', 'close', 'send', 'sendline', 'expect']:
             return getattr(self.pipe, name)

     def open(self):
         self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.socket.connect((self.host, self.port))
         self.pipe = pexpect.fdspawn(self.socket)
         self.expect('Username:', timeout=2)
         self.sendline(self.user)
         self.expect('Password:', timeout=1)
         self.sendline(self.passwd)
         self.send('ATZ\r')
         self.expect('OK', timeout=1)

     def send(self, s):
         self._last = s
         return self.pipe.send(s)

     def sendcr(self, s):
         self._last = s
         return self.pipe.send(s+'\r')

     def sendline(self, s):
         self._last = s
         return self.pipe.sendline(s)

     def expect(self, pattern, **kwds):
         rc = self.pipe.expect(pattern, **kwds)
         if self.logger:
             self.logger.debug('sent "%s", received\n\t1. before "%s"\n\t' \
                 '2. match "%s"\n\t3. after "%s"\n', self._last,
                 self.before, self.match.group(0), self.after)
         return rc

     def close(self):
         self.pipe.close()
         self.pipe = None
         self.socket.close()
         self.socket = None

George



More information about the Python-list mailing list