Python Pexpect库的简单使用
Python Pexpect库的使用
简介
最近需要远程操作一个服务器并执行该服务器上的一个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.pychild = 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 noneif i == 0: # Timeoutprint "Timeout"return None# 提示是否确认连接if i == 1: child.sendline ('yes') # 我们输入yeschild.expect ('password: ')# 输入yes后 子程序应该提示输入密码,我们再次期待passwordi = child.expect([pexpect.TIMEOUT, 'password: '])#超时if i == 0: # Timeoutreturn 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.beforeprint child.afterexcept 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.pyanother 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.beforeprint "-----------------"#发送命令child.sendline(command)child.expect(['sftp>'])print "After sftp get command"print child.beforeprint "-----------------"child.sendline("bye")#child.expect(['sftp>'])print "After sftp bye"print child.beforeprint "-----------------"print child.afterreturn child
if __name__=='__main__':ip = "192.168.233.133"command = "get /home/python/test.txt"password = "********"child = sftp(ip , password , command)print child.beforeprint child.afterif os.path.exists("./test.txt"):print "Make sure transfer successfully"else :print "Can not find the transfer file"# ----------------------------结果-----------------------------------------------
'''
Before sftp get commandConnected to 192.168.233.133.-----------------
After sftp get commandget /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 byeget /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
'''
转载于:https://www.cnblogs.com/primadonna/p/10329094.html
Python Pexpect库的简单使用相关推荐
- python123九宫格输入_使用python PIL库实现简单验证码的去噪方法步骤
字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的. 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括: ...
- python pexpect_Python Pexpect库的简单使用方法
简介 最近需要远程操作一个服务器并执行该服务器上的一个python脚本,查到可以使用Pexpect这个库.记录一下. 什么是Pexpect?Pexpect能够产生子应用程序,并控制他们,并能够通过期望 ...
- [Python]urllib库的简单应用-实现北航宿舍自动上网
在北航,上网前必须通过一个认证系统.次次开电脑都要打开这个认证网页连接一下网络还是挺烦人的.刚好最近看了看了Python的urllib库,那么就写一个最简易的自动登录器吧....(这也算是我的Pyth ...
- 使用Python PIL库实现简单验证码的去噪处理
想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括:将彩色图片转换成灰度图.将灰度图二值化和去除噪点三个基本过程.这里仅以比较简单的验证码为例, ...
- python requests库的简单使用
requests是python的一个HTTP客户端库,跟urllib,urllib2类似,但比urllib,urllib2更加使用简单. 1. requests库的安装 在你的终端中运行pip安装命令 ...
- Python+tkinter库实现简单图书管理系统
文章目录 前言 一.MySQL是什么? 二.Tkinter库 三.Code步骤 1.引入库 2.使用tkinter搭建系统 3.定义函数(发送消息,操作mysql数据库) 总结 前言 使用mysql数 ...
- Python第三方库tabulate简单使用说明
库引用 使用tabulate库需先引用tabulate import tabulate 函数使用 tabulate.tabulate(tabular_data, headers=(), tablefm ...
- python numpy库的简单使用学习随笔(一)
一.numpy概述 numpy(Numerical Python)提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速.节省空间.numpy支持高级大量的维度数组与矩阵运算, ...
- 利用Python Matplotlib库做简单的视觉化(2)
Matplotlib练习 题目 练习一 方法一(条形图) 方法一效果图 方法二(扇形图) 方法二效果图 练习二 练习二代码 练习二效果图 小结 题目 练习一 方法一(条形图) from matplot ...
最新文章
- 类脑量子叠加脉冲神经网络:从量子大脑假说到更好的人工智能
- 《Unity着色器和屏幕特效开发秘笈》—— 2.1 引言
- CS起源pointermap找基址+工具函数测试
- k3s安装和卸载:轻量级K8S
- 从零写一个编译器(十三):代码生成之遍历AST
- python 嵌套数组_兴趣是最好的老师,快速入门:十分钟学会python
- 拓端tecdat|R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
- php 根目录怎么写,php – 如何重写根目录中的目录
- mysql 5.7.26 linux安装_mysql-5.7.28 在Linux下的安装教程图解
- Mac下安装配置Tomcat 9, Homebrew安装Tomcat
- 尚品汇Vue项目 前台+后台完成品源码(含在线演示)
- matlab 取模二和,取模(mod)与取余(rem)的区别——Matlab学习笔记
- linux下桌面编程软件,慧编程桌面端下载|慧编程桌面版 V1.2.0 Linux版 下载_当下软件园_软件下载...
- android随机抽奖代码_Android 中从一个集合或者数组中随机抽取几个不同的值
- ppt流程图箭头分叉_职场PPT实战:流程图只能箭头方框?设计师教你新思路
- 设置win10锁屏壁纸为桌面背景
- 汉堡按钮html写法,ProtoPie 详解 — 汉堡按钮制作
- 远程服务器登入信息,怎样查看服务器被远程登录的信息
- 通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)
- 运用yolov5人脸识别模型生成标准的一寸照视频
热门文章
- 华为鸿蒙太空人壁纸,华为太空人动态壁纸下载-华为太空人动态壁纸图片高清版-丫丫安卓网...
- SQL | DB2和MySQL分条件求和
- a豆的使命:每一位年轻人都值得珍重
- iOS各种设备识别码IDFA、UDID、UUID、MAC、OpenUDID、IDFV
- hdu-1052 Tian Ji -- The Horse Racing
- win7计算机不能设置双屏怎么回事,win7怎么设置双屏显示?Win7双屏显示设置的方法...
- Convolution Arithmetic
- ES6_1.块级作用域绑定_临时死区TDZ
- 在移动端打开 Google 的网页快照
- Mysql基础篇(4)—— 创建和管理表