python之pexpect实现自动交互

Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。
整体来说大致的流程包括:
  1. 运行程序
  2. 程序要求人的判断和输入
  3. Expect 通过关键字匹配
  4. 根据关键字向程序发送符合的字符

基本使用流程

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

  1. 首先用 spawn 来执行一个程序
  2. 然后用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的
  3. 最后当发现这个关键字以后,根据关键字用 send 方法来发送字符串给这个程序

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

spawn() - 执行程序

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

process = pexpect.spawn('ftp sw-tftp')

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

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

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

正确的方式:

process = pexpect.spawn('/bin/bash –c "ls –l | grep LOG > 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() 向子程序发送控制字符,比如 <kbd>ctrl+C</kbd> 或者 <kbd>ctrl+D</kbd> 之类的,比如你要向子程序发送 <kbd>ctrl+G</kbd>,那么就这样写:

process.sendcontrol('g')
简单实例:
command = 'ssh '+username+ '@'+host
child = pexpect.spawn(command)
ret = child.expect([pexpect.TIMEOUT, 'Are you sure you want to continue connecting', '[P|p]assword']+PROMPT)
if ret == 0:
    print( '[-] Error Connecting')
    return
if ret == 1:
    child.sendline( 'yes')
    ret = child.expect([pexpect.TIMEOUT, '[p|P]assword'])
    if ret == 0:
        print( '[-] Error Connecting')
        return
    if ret == 1:
        send_command(password)
        return
if ret == 2:
    send_command(password)
    return
return child

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

其常用方法是:

login()  #建立ssh连接
logout()  #断开ssh连接
prompt()  #等待系统提示符,用于等待命令执行结束
详情请戳:https://blog.csdn.net/zhongbeida_xue/article/details/78679601
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pexpectPython语言中的一个第三方模块,用于控制和自动化操作控制台或终端程序。它可以实现自动输入命令、自动应答、自动交互式控制等功能,适用于自动化测试、批量操作等场景。 pexpect模块的常用类和方法包括: - spawn类:用于启动一个子进程并连接到其标准输入、输出和错误输出,可以在子进程中执行命令。 - expect方法:等待子进程输出特定的字符串或正则表达式,并返回匹配的字符串。 - send方法:向子进程发送字符串或命令。 - interact方法:进入交互模式,允许用户手动输入和输出。 - timeout属性:设置expect方法等待子进程输出的超时时间。 下面是一个示例代码,演示了如何使用pexpect模块连接到telnet服务器,并执行登录和命令操作: ``` import pexpect host = '127.0.0.1' port = 23 user = 'user' password = 'password' command = 'ls' # 启动telnet进程 child = pexpect.spawn('telnet %s %d' % (host, port)) # 等待登录提示 child.expect('login:') # 发送用户名 child.sendline(user) # 等待密码提示 child.expect('Password:') # 发送密码 child.sendline(password) # 等待登录成功提示 child.expect('$') # 发送命令 child.sendline(command) # 等待命令输出 child.expect('$') # 输出命令结果 print(child.before.decode()) # 退出交互模式 child.interact() ``` 这段代码中,使用spawn类启动一个telnet子进程,并通过expect和send方法实现自动登录和执行命令。最后使用interact方法进入交互模式,允许用户手动操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值