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

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

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

运行程序

程序要求人的判断和输入

Expect 通过关键字匹配

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

基本使用流程

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

首先用 spawn 来执行一个程序

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

最后当发现这个关键字以后,根据关键字用 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://www.jb51.net/article/156232.htm

以上这篇python之pexpect实现自动交互的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python pexpect ssh 远程登录服务器的方法

    使用了python中的pexpect模块,在测试代码之前,可输入python进入交互界面,输入help('pexpect'),查询是否本地含有pexpect模块. 如果没有,linux系统输入 easy_install pexpect便可自动安装. 测试代码,连接127.0.0.1 下面是我手动连接127.0.0.1, 发现只有在首次使用ssh连接127.0.0.1时,需要输入yes or no ,而后再次使用ssh ,则不需要再次输入yes 直接输入密码即可. 后续测试代码是二次链接,无需查询

  • python Pexpect 实现输密码 scp 拷贝的方法

    在服务器A上的程序用到服务器B上的文件data,并且需要定期更新文件. 但是直接在bash文件中使用 scp -P 1000 192.168.199.10:/temp/data /temp 由于权限限制,不能免ssh密码拷贝,会要求输入B机器的密码.本想直接在bash文件中使用Pexpect 来实现自动输入密码,并scp拷贝文件,但是权限的限制导致不能安装使用Pexpect . 最后考虑使用python实现. 环境: python2.7 centos from pexpect import *

  • 对Python Pexpect 模块的使用说明详解

    背景介绍 Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况.因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现.最初的第一个 Expect 是由 TCL 语言实现的,所以后来的 Expect 都大致参考了最初的用法和流程,整体来说大致的流程包括: 运行程序 程序要求人的判断和输入 Expect 通过关键字匹配 根据关键字向程序发送符合的字符串 TCL 语言实现的 Expect 功能非常强大,我曾经用它实现了防火墙

  • Python Pexpect库的简单使用方法

    简介 最近需要远程操作一个服务器并执行该服务器上的一个python脚本,查到可以使用Pexpect这个库.记录一下. 什么是Pexpect?Pexpect能够产生子应用程序,并控制他们,并能够通过期望模式对子应用的输出做出反应.Pexpect允许你的脚本产生子应用.控制他们像一个人类在输入命令一样. Pexpect使用在自动交互的应用,例如SSH.SFTP.PASSWD.TELNET.它可以被应用在使用自动设置脚本为不同的服务器自动地重复的安装软件包.也可以被应用在自动的软件测试. Pexpec

  • 使用python的pexpect模块,实现远程免密登录的示例

    说明 当我们需要用脚本实现,远程登录或者远程操作的时候,都要去解决如何自动输入密码的问题,一般来说有3种实现方式: 1).配置公钥私钥 2).使用shell下的命令,expect 3).使用python的pexpect模块 下面介绍的代码,是使用python的pexpect模块实现的: 代码 import os import sys import pexpect import datetime #获取昨天的日期 date_yes = (datetime.date.today()-datetime

  • Python安装使用命令行交互模块pexpect的基础教程

    一.安装 1.安装easy_install工具 wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py 安装easy_install工具(这个脚本会自动去官网搜索下载并安装) python ez_setup.py -U setuptools 升级easy_install工具 2.安装pexpect easy_install Pexpect 测试一下: [root@OMS python]# python Pyth

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

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

  • python基于pexpect库自动获取日志信息

    1. 前言 对大部分的人来说,解决 Bug 都是依靠关键字去日志去定位问题! 在调试情况下,我们可以实时在控制台查看日志:但对于部署到服务器上的应用,日志都存放在服务器某个目录下,没法通过本地查看到 这种情况下,就需要我们先登录服务器,然后进入到日志目录文件夹,最后通过日志文件去定位问题:如果涉及到 K8s 容器,可能还需要使用 kubectl 命令进入到服务对应的容器中,进入到日志目录,才能开始定位问题,这一切显得非常繁琐且低效 本篇文章介绍一款 Python 依赖库:pexpect,作为一款

  • python使用flask与js进行前后台交互的例子

    flask与js进行前后台交互代码如下,后台给前端发数据: python部分: # -*- coding: utf-8 -*- from flask import Flask,jsonify,render_template import json app = Flask(__name__)#实例化app对象 testInfo = {} @app.route('/test_post/nn',methods=['GET','POST'])#路由 def test_post(): testInfo['

  • Python模块pexpect安装及使用流程

    目录 一.pexpect模块介绍 二.Pexpect的安装 三.pexpect的核心组件 3.1spawn类 3.1.1简介 3.1.2使用流程 3.1.4基本属性和方法 3.1.5其他发送信息的方法 3.1.6其他获取结果的方法 3.1.7其他常用方法 3.1.8控制子程序方法 一.pexpect模块介绍 Pexpect使Python成为控制其他应用程序的更好工具.可以理解为Linux下的expect的Python封装,通过pexpect我们可以实现对ssh,ftp,passwd,telnet

  • 使用Python实现跳一跳自动跳跃功能

    1.   OpenCV:模板匹配.    获得小跳棋中心位置 2.   OpenCV:边缘检测.    获得下一方块中心位置 Python+ADB+OpenCv,实现「 跳一跳 」自动化. / 01 / ADB ADB工具即Android Debug Bridge(安卓调试桥) tools. ADB 是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互. 与之前小F接触过的Appium有点相似. ADB的安装很简单,就是将安装包解压后,将路径添加到系统的环境变量中即可. 然后使用Python

  • python 利用toapi库自动生成api

    在学习做接口测试自动化的时候,我们往往会自己动手写一些简单的API,比如写一个简单的TODO API之类. 不过自己写API的时候经常需要造一些假数据,以及处理分页逻辑,开始的时候还觉得比较有意思,但久而久之就显得比较乏味了. 这时候你可能会想,有没有什么工具可以自动将一个线上的网站转化成简单的API呢? 这样的工具确实是存在的,而且不少,其中python语言中比较受欢迎的实现是https://github.com/gaojiuli/toapi项目,项目名称是toapi. 我们来简单体验一下这个

  • python中Pexpect的工作流程实例讲解

    1.工作流程步骤 (1)用spawn来执行一个程序: (2)用expect方法来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的: (3)当发现这个关键字以后,使用send/sendline方法发送字符串给这个程序. 2.实例 spawn类 class spawn(SpawnBase): '''This is the main class interface for Pexpect. Use this class to start and control child applica

  • Python利用PyAutoGUI实现自动点赞

    目录 前言 思路 实现 总结 前言 在上篇文章<Python自动操作 GUI 神器——PyAutoGUI>中,我跟大家讲解了一下 pyautogui 的一些基础知识和操作,大家反馈很好,给了我好多赞,在此先跟大家说声三克油! 在得到大家正反馈的同时,我受到了很大鼓舞,感觉如果只是介绍一下基础操作,有点不过瘾,所以今天晚上加班回来,虽然很不想打开电脑,但是还是忍着疲惫给大家奉献一个小实例. 为此,我跑去洗手间用凉水洗了一把脸,顿时清醒多了,下面进入正题. 作为一个 GUI 操作的神器,我们看到了

  • Linux Shell 自动交互功能实现

    需求背景: 近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大量重复性操作,既不能带来有效学习能力提升,同时也会极大产生不确定性,引发工作效率下降,那么如何自动化完成某些操作呢,尤其是带有交互功能的步骤呢,例如需要输入账号密码? 1. EOF 多文本输入 需求案例 1 新交付了一批机器,每台机器只分配了一块落盘 ,现在根据需求对该盘进行分区并实现挂载,如何实现?

随机推荐