2011-04-09 33 views
2

我正在寫一些pexpect的東西,基本上是通過telnet發送命令。捕捉在一個垂死的過程

但是,我的遠程登錄會話可能會死(由於網絡問題,電纜被拉,什麼都沒有)。

如何初始化一個telnet會話,如果它死了,我可以抓住它並告訴它重新連接,然後繼續執行它所在的代碼。

這可能嗎?

回答

3

恕我直言,你常富裕與像exscripttelnetlib當前維護的庫,但在pexpect高效的咒語是:

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:它使得編程聽起來像黑魔法。 – slezica 2011-04-09 03:16:12

0

我這樣做,和它的工作:

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 

遞歸FTW?

+0

當你發送任何東西上面登錄?無論你做什麼,你都需要考慮'pexpect'需要成對看'send' /'expect' ...... – 2011-04-09 05:25:49