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 相关文章推荐
easy_install python包安装管理工具介绍
Feb 10 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 Python
Python paramiko模块的使用示例
Apr 11 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
python实现弹窗祝福效果
Apr 07 Python
FFrpc python客户端lib使用解析
Aug 24 Python
python实现两个文件夹的同步
Aug 29 Python
python实现PDF中表格转化为Excel的方法
Jun 16 Python
python中opencv实现图片文本倾斜校正
Jun 11 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 select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
js页面跳转常用的几种方式
2010/11/25 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
详解react-redux插件入门
2018/04/19 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
好的Python培训机构应该具备哪些条件
2018/05/23 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
详解python的argpare和click模块小结
2019/03/31 Python
python实现大学人员管理系统
2019/10/25 Python
python实现操作文件(文件夹)
2019/10/31 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
策划助理岗位职责
2013/11/18 职场文书
青年文明号汇报材料
2014/12/23 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS