【CentOS】一个简单的Expect实例详解

Expect是基于Tcl的相对简单的一个免费的基本变成工具语言,用于实现自动和交互式任务程序进行通信,无须人工干预。

一、Expect的安装检查与Linux系统的实验环境

1、Expect的安装

[[email protected]]# rpm -qa expect
expect-5.43.0-8.el5
expect-5.43.0-8.el5
#如果未安装expect,可以通过yum进行安装
[[email protected]]# yum install expect -y

2、Linux的系统版本和内核版本

[[email protected]]# cat /etc/redhat-release
CentOS release 5.8 (Final)
[[email protected]]# uname -a
Linux C58-Server 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

二、Expect的代码:以下的代码用于实现远程的文件分发拷贝。

copyfile.exp代码如下:

Expect程序工作流程:spawn启动进程 ——> expect期待关键字 ——> send向进程发送字符 ——> eof退出结束

#!/usr/bin/expect
if { $argc != 3 } #获取参数的个数
{
send_user "usage:expect scp-expect.exp file host dir\n"
exit
}
#定义变量
set file [lindex $argv 0]
set host [lindex $argv 1]
set dir [lindex $argv 2]

set password "nowsun.net" #对变量password进行赋值
spawn scp -P 22 -p $file [email protected]$host:$dir #启动scp的拷贝进程
expect {
#获取yes/no的关键字,如果获取到,则自动填写yes
#/r为在send中识别为回车,/n识别为换行,/t识别为制表符
"yes/no" {send "yes\r";exp_continue}
"password" {send "$password\r";exp_continue}
eof
}
exit  -onexit { #退出脚本之前做一些扫尾工作,可以接一些命令。
send_user "Good bye\n"
}
#如果不想退出该进程可以使用interact
#spawn ssh ip,这样ssh到远程服务器的时候就不会自动退出来。

说明:

send_user命令用来把后面的参数输出到标准输出中去,即显示到屏幕上

send、exp_send命令都是将参数输出到程序中去

exp_continue属于一个动作命令,命令可以不断循环匹配,输入多条命令。

说如果没有这个命令,匹配第一个关键字以后就会继续匹配第二个关键字,但

有了这个命令后,匹配第一个关键字以后,第二次匹配仍然从第一个关键字开始。

exit命令功能很简单,就是直接退出脚本。

eof(end-of-file)关键字用于匹配结束符。

copyfile.sh代码如下:

#!/bin/sh
. /etc/init.d/functions #调用functions函数供/bin/true和/bin/false使用
for ip in {10.0.0.10,10.0.0.12}
do ping -c 2 $ip > /dev/null 2>&1
#[ $? -eq 0 ]用于判断ping -c 2 $ip执行的正确与否,不正确则为不为0,正确的话,则为0
if [ $? -eq 0 ];then
#引用copyfile.exp文件
expect copyfile.exp /etc/hosts $ip /tmp > /dev/null 2>&1  
action "$ip" /bin/true
else
action "$ip" /bin/false
fi
done

三、执行验证

[[email protected]]# sh copyfile.sh
#因为10.0.0.12的主机不存在,所以执行的时候为失败
10.0.0.10 [ OK ]
10.0.0.12 [FAILED]

#检查hosts文件是否拷贝成功
[[email protected] tmp]# ll
total 8
-rw-r--r-- 1 root root 207 Dec 23 00:25 hosts

【CentOS】一个简单的Expect实例详解,布布扣,bubuko.com

时间: 2024-10-25 04:48:47

【CentOS】一个简单的Expect实例详解的相关文章

java网页爬虫简单实例详解——获取天气预报。

[本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好.这里只是举个例子.话不多说了,上看看效果吧. [效果] 我们随便找个天气预报的网站来试试:http://www.weather.com.cn/html/weather/101280101.shtml 从图中可用看出,今天(6日)的天气.我们就以这个为例,获取今天的天气吧! 最终后台打印出: 今天:6日

RabbitMQ实例详解+Spring中的MQ使用

RabbitMQ实例详解 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构. Queue Queue(队列)是RabbitMQ的内部对象,用于存储消息,用下图表示. RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费. 多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不

Cocos2d-x 3.X手游开发实例详解

Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰然网创始人杨雍力荐) 于浩洋 著   ISBN 978-7-121-23998-4 2014年9月出版 定价:59.00元 356页 16开 编辑推荐 以Cocos2d-x V3.0为框架全面讲解手游开发的知识和方法 以热门游戏2048.卡牌为例,完整再现手游的开发过程 Cocos2d-x作者之一林

实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)

在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然QuerySet的文档中已经详细说明了,但本文试图从QuerySet触发的SQL语句来分析工作方式,从而进一步了解Django具体的运作方式. 本来打算写成一篇单独的文章的,但是写完select_related()之后发现长度已经有点长了,所以还是写成系列,大概在两到三篇.整个完成之后将会在这里添加上

《HTML 5网页开发实例详解》目录

第一篇  从宏观上认识HTML 5 讲述了HTML 5引发的Web革命.HTML 5的整体特性.HTML 5相关概念和框架和开发环境搭建. 第1章 HTML 5引发的Web革命 1.1  你是不是真的了解HTML 5 1.1.1  通过W3C认识HTML 5的发展史 1.1.2  HTML 5.HTML4.XHTML的区别 1.1.3  什么人应该学HTML 5 1.1.4  一个图告诉你如何学习HTML 5 1.2  浏览器之争 1.2.1  说说这些常见的浏览器 1.2.2  浏览器的兼容烦

Spring基于事件驱动模型的订阅发布模式代码实例详解

代码下载地址:http://www.zuidaima.com/share/1791499571923968.htm 原文:Spring基于事件驱动模型的订阅发布模式代码实例详解 事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点: 首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): 当目标发送改变(发布),观察者(订阅者)就可以接收到改变: 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的

实例详解:反编译Android APK,修改字节码后再回编译成APK

本文详细介绍了如何反编译一个未被混淆过的Android APK,修改smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk无论输入什么样的用户名和密码都可以成功进入到第二个Activity. 有时难免要反编译一个APK,修改其中的若干关键判断点,然后再回编译成一个全新的可用的apk,这完全是可实现的.若要完成上述工作,需要以下工具,杂家后面会把下载链接也附上.这些软件截止本文发布时,经过杂家确认都是最新的版本. 1.APK-Multi-Toolv1.0.11.zip 用它

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)

前两章我为大家详细介绍了如何搭建Maven环境.Spring MVC的流程结构.Spring MVC与Struts2的区别以及示例中的一些配置文件的分析.在这一章,我就对示例的层次结构进行说明,以及MyBatis的一些简单介绍. 本文不会对MyBatis作详细说明,大象还是假定阅读本文的朋友对MyBatis(ibatis)有最基本的了解,只有这样才能较好的理解本文的内容.关于MyBatis请查看它的官方文档及其它参考资料,本文不作详细讨论. 一.工程结构图      上面这是典型的Maven项目

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)

Spring更新到3.0之后,其MVC框架加入了一个非常不错的东西——那就是REST.它的开放式特性,与Spring的无缝集成,以及Spring框架的优秀表现,使得现在很多公司将其作为新的系统开发框架.大象根据实际的项目经验,以之前SSH2例子为基础,对其进行一次大改造,详细的为大家讲解如何实现SSM3全注解式的开发. 这次大象将采取两种构建方式,一是很多人喜欢用的MyEclipse,另一个,则是用Eclipse+Maven.这一篇,将主要讲解开发环境设置与Maven构建方式. 1. 开发环境