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 相关文章推荐
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
Python标准库之Sys模块使用详解
May 23 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
Pythont特殊语法filter,map,reduce,apply使用方法
Feb 27 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
如何利用python实现Simhash算法
Jun 28 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
用cookies来跟踪识别用户
2006/10/09 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
js中日期的加减法
2015/05/06 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python for循环与range函数的使用详解
2019/03/23 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
YUV转为jpg图像的实现
2019/12/09 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
教师师德教育的自我评价
2013/10/31 职场文书
年终总结会主持词
2014/03/25 职场文书
教师求职信
2014/06/17 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
新员工考核评语
2014/12/31 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
基于python实现银行管理系统
2021/04/20 Python
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python