Python Pexpect库的简单使用方法


Posted in Python onJanuary 29, 2019

简介

最近需要远程操作一个服务器并执行该服务器上的一个python脚本,查到可以使用Pexpect这个库。记录一下。

什么是Pexpect?Pexpect能够产生子应用程序,并控制他们,并能够通过期望模式对子应用的输出做出反应。Pexpect允许你的脚本产生子应用、控制他们像一个人类在输入命令一样。

Pexpect使用在自动交互的应用,例如SSH、SFTP、PASSWD、TELNET。它可以被应用在使用自动设置脚本为不同的服务器自动地重复的安装软件包。也可以被应用在自动的软件测试。

Pexpect的主要特点是需要Python的基本库pty,这个库只有在类Unix系统上才有

Pexpect关于SSH的使用

注:测试,我们直接用虚拟机本机ssh本机

环境

1. win10 物理机
2. Vmware Centos 虚拟机
3. Xshell
4. 虚拟机python安装pexpect:pip install pexpect

在虚拟机创建一个 python文件

#-*- coding:UTF-8 -*-
import pexpect
# 定义ssh连接
def ssh(user,host,password,command):
  #创建子应用,命令是 ssh -l root 127.0.0.1 python /home/python/test.py
  child = pexpect.spawn('ssh -l %s %s %s'%(user,host,command))
  # 期待开启的子程序的显示,子程序的不同显示会匹配到不同key然后我们定义不同的操作
  # 0 : 连接超时
  # 1 :ssh有时候提示你是否确认连接
  # 2 :提示输入密码
  # 3 :匹配到#号,表示命令已经执行完毕。没用到
  i = child.expect([pexpect.TIMEOUT, 'Are you sure you want to continue connecting','password:',r"([^-]>|#)"])
  # 如果登录超时,renturn none
  if i == 0: # Timeout
    print "Timeout"
    return None
  # 提示是否确认连接
  if i == 1: 
    child.sendline ('yes') # 我们输入yes
    child.expect ('password: ')# 输入yes后 子程序应该提示输入密码,我们再次期待password
    i = child.expect([pexpect.TIMEOUT, 'password: '])
    #超时
    if i == 0: # Timeout
        return None
  # 不考虑其他情况,走到此处时,要么timeout 已经return ,要么等待输入密码
  #输入密码
  child.sendline(password)
  # 返回子程序
  return child
if __name__ =='__main__':
  try:
    # 配置数据
    host='127.0.0.1'
    user="root"
    password = '********'
    command = 'python /home/python/test.py'
    #command="ls -l"
    child = ssh(user,host,password,command)
    #这句是将子程序的命令行拉到末端
    test = child.expect(pexpect.EOF)
    #child中before就是我们要的数据,有时候还会在 after中
    print child.before
    print child.after
  except Exception,e:
    print str(e)
# 最终的显示结果是 test.py中打印的hahaha结果,
[root@localhost python]# python test_pexpect.py 
 
hahaha


<class 'pexpect.exceptions.EOF'>

我们尝试一下开两个虚拟机的情况

上面的代码只需要更改ip user password即可

# ip 192.168.233.133
# user root
# 在另一台虚拟机的相同位置创建/home/pyhton/test.py 内容如下
if __name__=="__main__":
  print "another virual machine hahaha"
# 打印结果
[root@localhost python]# python test3.py
 
another virual machine hahaha

<class 'pexpect.exceptions.EOF'>

Pexpect 关于 SFTP的使用

与ssh相同,就是使用python在当前机器上输入sftp ip 然后期望结果,输入密码,并发送get下载文件即可。

注:使用的时候发现一点注意:在每次执行sendline之前 都需要重新期望一下当前的sftp>,或者在每次输入sendline之后重新期望一下sftp>。也就是期望到这行,否则输入的命令都没有反应,我理解是远程连接的服务器有输出时候当前的位置可能不在sftp>这里所以在sendline的任何东西都是无意义的。如果这个解释不对望高人指点一下,

# --*-- coding:utf-8 --*--
import pexpect
import os
import time
def sftp(ip , password , command):
        # 创建子应用
        child = pexpect.spawn("sftp %s"%(ip))
        i = child.expect([pexpect.TIMEOUT,'password:'])
        # 超时
        if i == 0 :
            print "Timeout"
            return None
        # 准备输入密码
        if i == 1 :
            # 输入密码
            child.sendline(password)
            j = child.expect([pexpect.TIMEOUT,'sftp>'])
            # 超时
            if j == 0:
                print "Timeout"
                return None
            # 匹配到进入sftp命令模式
            if j==1:
                print 'Before sftp get command'
                print child.before
                print "-----------------"
                #发送命令
                child.sendline(command)
                child.expect(['sftp>'])
                print "After sftp get command"
                print child.before
                print "-----------------"
                child.sendline("bye")
                #child.expect(['sftp>'])
                print "After sftp bye"
                print child.before
                print "-----------------"
                print child.after
                return child
if __name__=='__main__':
        ip = "192.168.233.133"
        command = "get /home/python/test.txt"
        password = "********"
        child = sftp(ip , password , command)
        print child.before
        print child.after
        if os.path.exists("./test.txt"):
                print "Make sure transfer successfully"
        else :
                print "Can not find the transfer file"

# ----------------------------结果-----------------------------------------------
'''
Before sftp get command
 
Connected to 192.168.233.133.

-----------------
After sftp get command
 get /home/python/test.txt
Fetching /home/python/test.txt to test.txt
/home/python/test.txt             100%  73  25.2KB/s  00:00  

-----------------
After sftp bye
 get /home/python/test.txt
Fetching /home/python/test.txt to test.txt
/home/python/test.txt             100%  73  25.2KB/s  00:00  

-----------------
sftp>
 get /home/python/test.txt
Fetching /home/python/test.txt to test.txt
/home/python/test.txt             100%  73  25.2KB/s  00:00  

sftp>
Make sure transfer successfully
'''

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
Python中的二叉树查找算法模块使用指南
Jul 04 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
利用nohup来开启python文件的方法
Jan 14 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
python-numpy-指数分布实例详解
Dec 07 Python
Python3 集合set入门基础
Feb 10 Python
python re模块匹配贪婪和非贪婪模式详解
Feb 11 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
用python获取txt文件中关键字的数量
Dec 24 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 #Python
对python numpy.array插入一行或一列的方法详解
Jan 29 #Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 #Python
10 分钟快速入门 Python3的教程
Jan 29 #Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 #Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 #Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 #Python
You might like
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
python日志logging模块使用方法分析
2019/05/23 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Pycharm安装python库的方法
2020/11/24 Python
Nike香港官网:Nike HK
2019/03/23 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
初一家长会邀请函
2014/01/31 职场文书
协议书范本
2014/04/23 职场文书
公司董事长岗位职责
2014/06/08 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书