首页 > 代码库 > 用pexpect做简单的输出判断

用pexpect做简单的输出判断

之前用pexpect实现过一些简单的交互式操作,比如下边的登录操作:

import pexpect

simulators={‘10.10.10.10‘: ‘root‘}
users={‘testuser‘:‘1101‘}

child = pexpect.spawn(ssh root@ + simulator) i = child.expect([[Pp]assword:,continue connecting (yes/no)?,#]) if i == 0: child.sendline(simulators[simulator]) elif i == 1: child.sendline(yes) child.expect([Pp]assword:) child.sendline(simulators[simulator]) elif i == 2: pass else: print(Login failed)

expect方法可以用于等待子程序中产生特定输出,然后做出特定的响应,如果没有出现想要的字符串就会抛出pexpect.TIMEOUT异常。

假如我想添加一个组或者用户,我想先判断系统中是否已经有组存在,如果有,我就去给这个组添加用户;如果没有,我就创建,然后再添加用户:

child.sendline(cat /etc/group | grep teams:)
child.expect(teams:)
child.expect(#)
if teams: in child.before:
    print(Group teams existed, continue to add users)
else:
    child.sendline(groupadd -g 1100 teams)
    child.expect(#)
    child.sendline(cat /etc/group | grep teams:)
    child.expect(teams:)
    child.expect(#)
    if teams: in child.before:
        print(Group teams added for %s successfully %(simulator))
    else:
        print(Group teams added failed, check on simulator %s manually, go to next simulator %simulator)
        continue


‘‘‘命令在linux中的输出
openstack12:/ # cat /etc/group | grep  teams
teams:!:1100:
openstack12:/ #
‘‘‘

说明:
child.expect(teams:)会匹配命令以及命令说出中的第一个teams,也就是‘cat /etc/group | grep  teams’中的teams,此时的child.before是第一行中的‘ cat /etc/group | grep ’,所以我继续做一个child.expect(#),‘#’匹配的是最后一行的‘#’,此时的child.before包含的内容是,第一行teams后边的回车以及第二行和第三行全部,然后对这个child.before做出判断即可:)
 

 

用pexpect做简单的输出判断