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中Apriori算法实现讲解
Dec 10 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
对Django 转发和重定向的实例详解
Aug 06 Python
python实现根据文件格式分类
Oct 31 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
Django 解决由save方法引发的错误
May 21 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
Python数据分析之pandas读取数据
Jun 02 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
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python文件操作方法详解
2020/02/09 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
师范学院教师自荐书
2014/01/31 职场文书
学习考察心得体会
2014/09/04 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
Java实现房屋出租系统详解
2021/10/05 Java/Android
Golang中channel的原理解读(推荐)
2021/10/16 Golang
分享几种python 变量合并方法
2022/03/20 Python