一.概述
1.pexpect可以理解成Linux下的expect的Python封装,通过pexpect可以实现对ssh、ftp、passwd、telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的;
2.安装
pip install pexpect
或easy_install pexpect
或
wget https://github.com/pexpect/pexpect/releases/download/3.0/pexpect-3.0.tar.gz
tar -zxvf pexpect-3.0.tar.gz
cd pexpect-3.0/
python setup.py install
若导入模块expect没有异常,则表示安装成功;
二.pexpect核心组件
1.spawn类
1)spawn是pexpect的主要类接口,功能是启动和控制子应用程序,构造函数:
class pexpect.spawn(command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None, ignore_sighup=True)
command:任何已知的系统命令,当该命令需要参数时,可以通过Python列表来传递,如:pexpect.spawn('/usr/bin/ssh', ['user@IP'])
timeout:等待结果的超时时间;
maxread:pexpect从终端控制台一次读取的最大字节数;
searchwindowsize:匹配缓冲区字符串的位置,默认是开始位置匹配;
注意:pexpect不会解析shell命令中的元字符,包括重定向“>”,管道“|”,通配符“*”,但是可以通过将存在这三个元字符的命令作为/bin/bash的参数来调用:
child = pexpect.spawn('/bin/bash -c "ls -l > file"')
child.expect("expect.EOF")
2)获取输出:
a.写入日志:
child = pexpect.spawn('command')
fout = file('mylog.txt', 'w')
child.logfile = fort
b.输出至标准输出:
child = pexpect.spawn('command')
child.logfile = sys.stdout
2.expect方法
expect方法定义了一个子程序输出的匹配规则;
expect方法定义:expect(pattern.timeout=-1,searchwindowsize=-1)
pattern表示匹配的字符串、pexpect.EOF(指向缓冲区尾部,无匹配项)、pexpect.TIMEOUT(匹配等待超时)、正则表达式或者他们组成的列表;
timeout:指定等待匹配结果的超时时间,单位为秒;
searchwindowsize:匹配缓冲区字符串的位置,默认是从开始位置匹配;
expect方法有before和after成员,before成员保存了最近匹配成功之前的内容,after成员保存了最近匹配成功之后的内容;
3.run函数
run函数是使用pexpect进行封装的调用外部命令的函数,类似于os.system或os.popen方法;
函数定义:
pexpect.run(command, timeout=-1, withexitstatus=Fause, events=None, extra_args=None, logfile=None, cwd=None, env=None)
command:系统已知的任何命令;
events:字典,定义了expect及sendline方法的对应关系;
使用:run('scp foo [email protected]:.', events={'(?i)password':mypasswd})
4.pxssh类
pxssh是pexpect的派生类,针对在ssh回话操作上再做一层封装,提供与基类更加直接的操作方法;
pxssh类定义:
class pexpect.pxssh(timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None)
pxssh常用的三个方法:
login():建立ssh连接;
logout():断开连接;
prompt():等待系统提示符,用于等待命令执行结束。