python之pexpect实现自动交互的例子

  

Pexpect是期望语言的一个Python实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的Python模块。Pexpect的使用范围很广,可以用来实现与ssh、ftp、telnet等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。

  

<强>整体来说大致的流程包括:

  

运行程序

  

程序要求人的判断和输入

  

期望通过关键字匹配

  

根据关键字向程序发送符合的字符

  

<>强基本使用流程

  

pexpect的使用说来说去,就是围绕3个关键命令做操作:

  

首先用产卵来执行一个程序

  

然后用希望来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的

  

最后当发现这个关键字以后,根据关键字用发送方法来发送字符串给这个程序

  

第一步只需要做一次,但在程序中会不停的循环第二,三步来一步一步的完成整个工作。掌握这个概念之后pexpect的使用就很容易了。当然pexpect不会只有这3个方法,实际上还有很多外围的其他方法,

  

<强>产卵()——执行程序

  

spawn()方法用来执行一个程序,它返回这个程序的操作句柄,以后可以通过操作这个句柄来对这个程序进行操作,比如:

     =pexpect过程。产卵(ftp sw-tftp)      

上面()中产卵的字符串就是要执行的程序,这里我们打开一个到sw-tftp服务器的ftp连接。()中产卵的第一个元素就是要执行的命令,除此之外还可以指定一些其他参数,比如:pexpect。产卵(ftp sw-tftp,超时=60)就指定了超时时间,这些具体的会在后面讲解。

  

过程就是产卵()的程序操作句柄了,之后对这个程序的所有操作都是基于这个句柄的,所以它可以说是最重要的部分。

  

注意:spawn(),或者说pexpect并不会转译任何特殊字符比如| *字符在Linux的壳中有特殊含义,但是在pexpect中不会转译它们,如果在Linux系统中想使用这些符号的正确含义就必须加上壳来运行,这是很容易犯的一个错误。

  

正确的方式:

     =pexpect过程。产卵('/bin/bash - c”ls - l | grep日志比;log_list.txt”)      

<强>期待()——关键字匹配

  spawn ()

当启动了一个程序并返回程序控制句柄后,就可以用期望()方法来等待指定的关键字了。它最后会返回0表示匹配到了所需的关键字,如果后面的匹配关键字是一个列表的话,就会返回一个数字表示匹配到了列表中第几个关键字,从0开始计算。

  

<强>发送()——发送关键字

  

发送()作为3个关键操作之一,用来向程序发送指定的字符串,它的使用没什么特殊的地方,比如:

        process.expect (“ftp>“)   process.send (“\ n”)      

这个方法会返回发送字符的数量。

  

<强> sendline()——发送带回车符的字符串

  

sendline()和()发送唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方:

  

只需要发送字符就可以的话用发送()

  

如果发送字符后还要回车的话,就用sendline ()

  

它也会返回发送的字符数量

  

<强> sendcontrol()——发送控制信号

  

sendcontrol()向子程序发送控制字符,比如& lt; kbd> ctrl + C或者& lt; kbd> ctrl + D比之类的,如你要向子程序发送& lt; kbd> ctrl + G,那么就这样写:

        process.sendcontrol (“g”)      

简单实例:

        命令=' ssh ' +用户名+“@”+主机   孩子=pexpect.spawn(命令)   ret=child.expect ([pexpect。超时,你确定你要继续联系的,' [P | P] assword '] +提示)   如果ret==0:   print([-]错误连接)   返回   如果ret==1:   child.sendline(“是”)   ret=child.expect ([pexpect.TIMEOUT, ' [p | p] assword '])   如果ret==0:   print([-]错误连接)   返回   如果ret==1:   send_command(密码)   返回   如果ret==2:   send_command(密码)   返回   返回子      

注:针对ssh远程登录,pexpect又派生出了pxssh类,在ssh会话操作上再做一层封装

  

<强>其常用方法是:

  

登录()#建立ssh连接

python之pexpect实现自动交互的例子