2011-04-09 3 views
2

J'écris des trucs pexpect qui envoient des commandes sur telnet. Mais, il est possible que ma session telnet puisse mourir (en raison de problèmes de réseau, d'un câble qui se tire, etc.).Attraper un processus de mort dans pexpect

Comment puis-je initialiser une session Telnet de sorte que, si elle meurt, je puisse l'attraper et lui dire de se reconnecter puis de continuer l'exécution du code où il se trouvait.

Est-ce possible?

Répondre

3

à mon humble avis, vous êtes normalement mieux avec une bibliothèque actuellement maintenue comme exscript ou telnetlib, mais le incantatoire efficace pexpect est:

import pexpect as px 

cmds = ['cmd1', 'cmd2', 'cmd3'] 
retcode = -1 
while (retcode<10): 
    if (retcode<2): 
     child = px.spawn('telnet %s %s' % (ip_addr,port)) 
    lregex = '(sername:)'   # Insert regex for login prompt here 
    pregex = '(prompt1>)|(prompt2$)' # Insert your prompt regex here 
    # retcode = 0 for px.TIMEOUT, 1 for px.EOF, 2 for lregex match... 
    retcode = child.expect([px.TIMEOUT, px.EOF, lregex, pregex],timeout = 10) 
    if (retcode==2): 
     do_login(child) # Build a do_login() method to send user/passwd 
    elif (2<retcode<10) and (len(cmds)>0): 
     cmd = cmds.pop(0) 
     child.sendline(cmd) 
    else: 
     retcode = 10 
+0

+1 pour utiliser le mot incantation: il fait que la programmation sonne comme de la magie noire. – slezica

0

Je l'ai fait, et cela a fonctionné:

def telnet_connect(): 
    print "Trying to connect via telnet..." 
    telnet_connecting = pexpect.spawn('telnet localhost 10023', timeout=2) 
    while 1: 
     try: 
      telnet_connecting.expect('login: ') 
      break 
     except: 
      telnet_connecting = telnet_connect() 
      break 
    return telnet_connecting 

Recursion FTW?

+0

Quand quelque chose envoyez-vous ci-dessus à la connexion? Quoi que vous fassiez, vous devrez tenir compte du besoin de 'pexpect' de voir' send'/'expect' par paires ... –