1、介绍pexpect

通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令进行自动交互,不需要人工干预达到自动目的。

2、pexpect的组件介绍

 2.1、spawn类

    作用:启动和控制子应用程序,其构造函数如下:

class pexpect.spawn(command,args=[],timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,env=None,ignore_sighup=True)

其中command是任意已知的系统命令,timeout是等待结果的超时时间,maxread是从终端一次读取的最大字节数,searchwindowsize是匹配缓冲区字符串的位置。

 注意点:pexpect不会解析shell命令中的元字符(重定向>,管道|,通配符*),不过将存在这三个特殊元字符的命令作为/bin/bash的参数进行调用,可以解决这个问题。比如:

child=pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"')

child.expect(pexpect.EOF)

将命令的参数以Python列表形式替换:

shell_cmd = 'ls -l | grep LOG >logs.txt'

child=pexpect.spawn('/bin/bash',['-c',shell_cmd])

child.expect(pexpect.EOF)


调试代码是,pexpect提供两种方式可以查看输入输出:1>写入到日志 2>输出到stdout

  child=pexpect.spawn('some_cmd')

  fout=file('mylog.txt','w')

  child.logfile = fout

或者:child.logfile=sys.stdout

系统批量运维管理工具pexpect_第1张图片

其中expect方法定义了一个子程序输出的匹配规则:

定义的方法是expect(pattern,timeout=-1,searchwindowsize=-1)

pattern表示字符串、pexpect.EOF(指向缓冲区尾部)、pexpect.TIMEOUT、正则表达式。


send向子程序发送相应命令,相当于标准输入键盘

send(self,s)发送命令,不回车

sendline(self,s='')发送命令,回车

sendcontrol(self,char)发送控制字符,如child.sendcontrol('c')相当于ctrl+c

sendeof()发送eof


2.2>run函数

run是使用pexpect进行封装的外部命令的函数

run(command,timeout=-1,withexitstatus=False,events=None,extra_args=None,logfile=None,cwd=None,env=None)

import pexpect

pexpect.run('scp filename user@ip:~',events={'(?)password':mypassword})


3、pxssh

pxssh针对ssh会话操作做了一层封装,提供了更加直接的操作方式

pxssh常用方法:login()建立ssh链接,logout()断开连接,prompt()等待系统提示符,用户等待命令执行完毕。


系统批量运维管理工具pexpect_第2张图片