expect脚本

expect是什么

expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。

在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行

由于在linux中的一些命令不太适合于脚本的自动化运行,比如fdisk,telnet,ftp连接下载等,所以必须使用except来解决交换问题。

except基础

包含以下四个命令

命令

作用

send

用于向进程发送字符串

except

从进程接收字符串

spwan

启动新进程

interact

允许用户交互

send命令接收一个字符串参数,并将该参数发送到进程。

expect命令和send命令相反,expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令。

spawn命令用来启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互。

interact命令用的其实不是很多,一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。

代码举例

#!/usr/bin/expect

set timeout 30

set host "101.200.241.109"

set username "root"

set password "123456"

spawn ssh $username@$host

expect "*password*" {send "$password"}

interact

这是一段非常简单代码,演示了基本用法

#!/usr/bin/expect:使用expect来解释该脚本;

set timeout 30:设置超时时间,单位为秒,默认情况下是10秒;

set host "101.200.241.109":设置变量;

spawn ssh $username@$host:spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。它主要的功能是给ssh运行进程加个壳,用来传递交互指令;

expect "password":这里的expect也是expect的一个内部命令,这个命令的意思是判断上次输出结果里是否包含“password”的字符串,如果有则立即返回;否则就等待一段时间后返回,这里等待时长就是前面设置的30秒;

send "$password":当匹配到对应的输出结果时,就发送密码到打开的ssh进程,执行交互动作;

interact:执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

这就是对上述这段简单简单脚本的分析,在上述的示例中,涉及到expect中一个非常重要的概念――模式-动作;即上述expect "password" {send "$password"}这句代码表达出来的含义。

模式-动作

结合着expect "password" {send "$password"}这句代码来说说“模式-动作”。简单的说就是匹配到一个模式,就执行对应的动作;匹配到password字符串,就输入密码

如下所示:

expect {

"password" {

send "$password"

exp_continue

}

eof

{

send "eof"

}

}

其中exp_continue表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。

传参

很多时候,我们需要传递参数到脚本中,现在通过下面这段代码来看看如何在expect中使用参数:

#!/usr/bin/expect

if {$argc < 3} {

puts "Usage:cmd "

exit 1

}

set timeout -1

set host [lindex $argv 0]

set username [lindex $argv 1]

set password [lindex $argv 2]

spawn ssh $username@$host

expect "*password*" {send "$password"}

interact

在expect中,$argc表示参数个数,而参数值存放在$argv中,比如取第一个参数就是[lindex $argv 0],以此类推。

FTP下载expect脚本

使用yum安装expect

yum install expect

按照如下编写expect脚本

#!/usr/bin/expect -f

set ip [lindex $argv 0] #脚本的第一个参数,远程主机的IP地址

set file [lindex $argv 1] #脚本的第二个参数,指定下载的文件名

set timeout 10 #设置超时时间10秒

spawn ftp $ip #运行ftp $ip命令

expect "Name*" #如果出现Name字符

send "anonymous " #则输入anoymous(匿名用户)并回车

expect "Password:*" #如果出现Password字符

send "" #则仅输入回车

expect "ftp>*" #如果出现ftp>字符

send "get $file" #则发送get $file命令

expect {

"*Failed*" { send_user " Download failed";send "quit"} #如果返回的字符串有Failed,则说明下载失败,send_user回显信息 Download failed

"*send*" { send_user " Download ok";send "quit"} #如果返回的字符串有send,则说明下载失败,send_user回显信息 Download ok

}

expect eof #结束循环匹配

给脚本加上可执行权限chmod +x expect_ftp_auto.exp

pexpect模块

pexpect可以理解为linux下的expect的python封装,通过pexpect可以实现ssh,ftp,passwd,telnet等命令的进行自动交互

安装pip install pexpect

简单实现ssh自动登录的示例如下:

import pexpect

child = pexpect.spwan("scp foo user#expample.com:.") #spwan启动scp程序

child.expect("Password:") #expect方法等待子程序产生的输出,判断是否匹配定义的字符串

#‘Password:"

child.sendline(mypassword) #匹配后则发送密码进行回应

核心组件

spawn类

spawn是pexpect的主要入口,功能是启动和控制子应用程序,以下是它的构造函数

class pexpect.spwan(command,args=[],timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,env=None,ignore_sighup=True)

其中,command参数可以是任意已知的系统命令,比如

child=pexpect.spawn("user/bin/ftp")

当子程序需要参数的时候,还可以使用python列表来代替参数,如

child = pexpect.spwan("user/bin/ssh user@example.com")

参数timeout为等待结果的超时时间,maxread为从终端控制台一次读取的最大字节数,searchwindowsize参数为匹配的缓冲区字符串的位置,默认是从开始位置匹配

需要注意的是,pexpext不会解析shell命令中的元字符,包括重定向> 管道|或者通配符,此时可以将三个特殊元字符的命令作为/bin/bash的参数进行调用

child =expect.spwan("/bin/bash -c "ls -l | grep LOG> logs.txt"")

child.expect(pexpect.EOF)

可以通过将命令的参数以PYTHON列表的方式进行替换,从而使得语法更加清晰,下面的代码等同于上面的代码

shell_cmd="ls -l | grep LOG >logs.txt"

child=pexpext.spwan("/bin/bash",["-c,shell_cmd])

child.expect(pexpect.EOF)

在调试代码时,希望获取pexpect的输入与输出信息,以便了解匹配的情况,一种时写到日志中,另一种时输出到标准输出

写到日志中

chidl-pexpect.spwan("some_command")

fout=file("mylog.txt,"w")

child.logfile=fout

输出到标准输出的方法

child=pexpect.swpan("some_command")

chuld.logfile=sys.stdout

以下为SSH远程登录举例,登录成功后显示/home目录的文件并且记录输入与输出

import pexpect

import sys

child=pexpect.spawn("ssh root@172.31.208.129")

fout=open("mylog.txt","w")

child.logfile=fout

#child.logfile=sys.stdout

child.expect("password:")

child.sendline("abc@123")

child.expect("#")

child.sendline("ls /home")

child.expect("#")

expect方法

expect定义了子程序输出的匹配规则

方法定义:expect(pattern,timeout=-1,searchwindowsize=-1)

其中,参数pattern表示字符串,pexpext.EOF(指向缓冲区,无匹配项)、pexpect,TIMEOUT(匹配等待超时),正则表达式或者列表

参数timeout指定了等待匹配结果的超时时间,单位为秒,当超时被触发的时候,expect将匹配到pexpext.TIMEOUT,参数searchwindowsize为匹配的缓冲字符串的位置,默认时从开始的位置匹配

read相关方法

下面的的方法作用都是向子程序发送响应命令

send(self,s) #发送命令,不回车

sendline(self,s=" "),#发送命令,回车

snedcontrol(self.char) #发送控制字符

sendeof() #发送eof

run函数

run时使用pexpext进行封装的调用外部命令的的函数

from pexpect import *

run("scp foo user@example.com:.",events={"(?i)password":mypassword])

pxssh类

针对ssh会话操作上再做一次封装

class pexpext.pxssh.pxssh(timeout=30,maxread=2000,searchwindwosize=None,logfile=None,cwd=None,env=None)

常用方法

login()建立ssh连接

logout() 断开连接

promp()等待系统提示符,用于等待命令执行结束

import pxssh

import getpass

try:

s = pxssh.pxssh() #创建对象s

hostname = raw_input("hostname: ")

username = raw_input("username: ")

password = getpass.getpass("password: ") #接收密码输入

s.login (hostname, username, password) #建立ssh连接

s.sendline ("uptime") # 运行uptime命令

s.prompt() # 匹配系统提示符

print s.before # 打印系统体术符号出现前的命令输出

s.sendline ("ls -l")

s.prompt()

print s.before

s.sendline ("df")

s.prompt()

print s.before

s.logout()

except pxssh.ExceptionPxssh, e:

print "pxssh failed on login."

print str(e)

FTP自动操作

实现自动交互登录FTP操作

import pexpect

import sys

child = pexpect.spawnu("ftp ftp.openbsd.org") #运行ftp命令

child.expect("(?i)name .*: ") #(?!)表示后面的字符串正则表达式忽略大小写

child.sendline("anonymous") # 输入ftp账号信息

child.expect("(?i)password") #匹配密码提示

child.sendline("pexpect@sourceforge.net")

child.expect("ftp> ")

child.sendline("bin") #启用二进制传输

child.expect("ftp> ")

child.sendline("get robots.txt")

child.expect("ftp> ")

sys.stdout.write (child.before) #输出匹配的"ftp"之前的输入与输出操作

print("Escape character is "^]".

")

sys.stdout.write (child.after)

sys.stdout.flush()

child.interact() # Escape character defaults to ^] #让出控制权,用户可以继续当前会话手工控制子程序,默认输入"^]"字符跳出

child.sendline("bye")

child.close()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。

原文链接:https://blog.51cto.com/11555417/2514325

python 解析模块脚本_Python pexpect模块及shell脚本except原理解析相关推荐

  1. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  2. linux防火墙shell脚本,Linux系统目录结构,Shell脚本;关闭和开启防火墙

    Linux系统目录结构 目录 描述 备注 /bin a.存放着最经常使用的命令 b.可执行文件,用户命令 c.构建最小系统所需要的命令 /boot a.内核与启动文件 b.系统启动相关文件 c.启动L ...

  3. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  4. linux shell脚本 nohup,linux真正使用shell脚本做定时任务 关键的Nohup

    网上有很多的文章教大家使用定时任务,所以别的废话我就不多说了 我这里直接有SH来做定时,只是有一点大家不知道,一定要用Nohup,否则用户退出终端以后,SH任务会被自动终止掉 假设有一 tash.sh ...

  5. python pexpect模块详解_python pexpect模块

    Pexpect模块简介: Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 ...

  6. python pexpect模块详解_python Pexpect模块如何使用 python Pexpect模块使用代码示例

    python Pexpect模块如何使用?本篇文章小编给大家分享一下python Pexpect模块使用代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以 ...

  7. python常用模块用法_python常用模块(一)

    #什么是模块呢?就是用一大坨代码来完成一个功能的代码集合,是不是简单易懂 #类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个 ...

  8. python引入模块教程_python导入模块--案例

    1 导入模块 1.1 问题 本案例要求先编写一个star模块,主要要求如下: 建立工作目录 ~/bin/ 创建模块文件 ~/bin/star.py 模块中创建pstar函数,实现打印50个星号的功能 ...

  9. python模块总结_Python常用模块资料总结和归纳

    Python模块是什么? 一个完整大型的python程序是由模块和包的形式组织起来的,可见模块在python中的重要性.模块是一种组织型式,它许多有关联(关系)的代码组织放到单独的独立文件中.简单的说 ...

最新文章

  1. 60+业内技术专家,9大核心技术专题,AI ProCon倒计时一周!
  2. 官宣弃用Java 8!Kafka 3.0.0 新功能get
  3. C++文件类(文件流类)及用法详解
  4. 利用python爬虫(part3)--正则表达式
  5. 如何在CRM和C4C中用代码判断当前是否处于configuration模式
  6. linux 进程崩溃log,linux调试:dmesg 查看程序崩溃原因分析方法之一
  7. HR问我为什么要离开上一家公司钱没给到位,心委屈了。这些归根到底就一条:干得不爽。
  8. 计算机教学研讨会议记录,教学教研工作会议记录3.doc
  9. Pytroch+DGL+模型设置相关总结
  10. HTML小游戏7 —— 《罗斯魔影》魔法消除游戏(附完整源码)
  11. 深大与南科大计算机,深圳大学和南方科技大学你选哪所?哪所实力更强?
  12. 五个海盗如何分100个金币呢?
  13. OGRE+CG学习日记[1]-简单的3D程序
  14. 详解SMS2003部署Windows 2003
  15. 荔枝FM、喜马拉雅FM、蜻蜓FM竞品分析
  16. 计算机班内排名公式,巧用Excel数组公式统计各班优秀人数EXCEL基本教程 -电脑资料...
  17. 面向协议与面向对象的区别
  18. 高数笔记一函数与极限
  19. 扣丁学堂笔记第22天多媒体播放
  20. 微服务系列:分布式文件存储之 MinIO 入门指南

热门文章

  1. jinja2模板用法详解
  2. Python生成器实现及yield关键字
  3. DIV CSS在不同IE版本和FF以及Chrome中的兼容性差异解决方法(推荐)
  4. ViewState的原理,应用场合,注意事项
  5. 漫步凸分析七——凸函数闭包
  6. Window10 Tensorflow 2.1 GPU 安装和测试
  7. 群组密钥交换的新方法研究与分析【会议】
  8. 梯度下降、牛顿法、拟牛顿法详细介绍
  9. Map排序,获取map的第一值,根据value取key等操作(数据预处理)
  10. 基于射影不变量的视野分界线划分算法