在pexpect中捕捉即将终止的进程

3 投票
2 回答
1807 浏览
提问于 2025-04-16 15:22

我正在写一些使用 pexpect 的代码,主要是通过 telnet 发送命令。

但是,我的 telnet 会话可能会因为网络问题、拔掉电缆或者其他原因而中断。

我想知道如何初始化一个 telnet 会话,这样如果它中断了,我可以捕捉到这个情况,然后让它重新连接,并继续执行之前的代码。

这样做可能吗?

2 个回答

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

递归真厉害?

4

在我看来,通常使用一个现在还在维护的库会更好,比如 exscript 或者 telnetlib。不过,如果你想用 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

撰写回答