python之pexpect实现自动交互的例子
Pexpect是Expect语言的一个Python实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的Python模块。Pexpect的使用范围很广,可以用来实现与ssh、ftp、telnet等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。
整体来说大致的流程包括:
运行程序
程序要求人的判断和输入
Expect通过关键字匹配
根据关键字向程序发送符合的字符
基本使用流程
pexpect的使用说来说去,就是围绕3个关键命令做操作:
首先用spawn来执行一个程序
然后用expect来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的
最后当发现这个关键字以后,根据关键字用send方法来发送字符串给这个程序
第一步只需要做一次,但在程序中会不停的循环第二、三步来一步一步的完成整个工作。掌握这个概念之后pexpect的使用就很容易了。当然pexpect不会只有这3个方法,实际上还有很多外围的其他方法,
spawn()-执行程序
spawn()方法用来执行一个程序,它返回这个程序的操作句柄,以后可以通过操作这个句柄来对这个程序进行操作,比如:
process=pexpect.spawn('ftpsw-tftp')
上面spawn()中的字符串就是要执行的程序,这里我们打开一个到sw-tftp服务器的ftp连接。spawn()中的第一个元素就是要执行的命令,除此之外还可以指定一些其他参数,比如:pexpect.spawn('ftpsw-tftp',timeout=60)就指定了超时时间,这些具体的会在后面讲解。
process就是spawn()的程序操作句柄了,之后对这个程序的所有操作都是基于这个句柄的,所以它可以说是最重要的部分。
注意:spawn(),或者说pexpect并不会转译任何特殊字符比如|*字符在Linux的shell中有特殊含义,但是在pexpect中不会转译它们,如果在linux系统中想使用这些符号的正确含义就必须加上shell来运行,这是很容易犯的一个错误。
正确的方式:
process=pexpect.spawn('/bin/bash–c"ls–l|grepLOG>log_list.txt"')
expect()-关键字匹配
当spawn()启动了一个程序并返回程序控制句柄后,就可以用expect()方法来等待指定的关键字了。它最后会返回0表示匹配到了所需的关键字,如果后面的匹配关键字是一个列表的话,就会返回一个数字表示匹配到了列表中第几个关键字,从0开始计算。
send()-发送关键字
send()作为3个关键操作之一,用来向程序发送指定的字符串,它的使用没什么特殊的地方,比如:
process.expect("ftp>") process.send("by\n")
这个方法会返回发送字符的数量。
sendline()-发送带回车符的字符串
sendline()和send()唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方:
只需要发送字符就可以的话用send()
如果发送字符后还要回车的话,就用sendline()
它也会返回发送的字符数量
sendcontrol()-发送控制信号
sendcontrol()向子程序发送控制字符,比如ctrl+C或者ctrl+D之类的,比如你要向子程序发送ctrl+G,那么就这样写:
process.sendcontrol('g')
简单实例:
command='ssh'+username+'@'+host child=pexpect.spawn(command) ret=child.expect([pexpect.TIMEOUT,'Areyousureyouwanttocontinueconnecting','[P|p]assword']+PROMPT) ifret==0: print('[-]ErrorConnecting') return ifret==1: child.sendline('yes') ret=child.expect([pexpect.TIMEOUT,'[p|P]assword']) ifret==0: print('[-]ErrorConnecting') return ifret==1: send_command(password) return ifret==2: send_command(password) return returnchild
注:针对ssh远程登录,pexpect又派生出了pxssh类,在ssh会话操作上再做一层封装
其常用方法是:
login()#建立ssh连接
logout()#断开ssh连接
prompt()#等待系统提示符,用于等待命令执行结束
详情请戳:https://www.nhooo.com/article/156232.htm
以上这篇python之pexpect实现自动交互的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。