expect详解

来源:互联网 发布:java培训机构课程安排 编辑:程序博客网 时间:2024/06/02 05:59

expect介绍:
expect 是基于Tcl开发的,(例如:scp,ssh,telnet等)主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp 登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率
expect 选项
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
选项
-c:从命令行执行expect脚本,默认expect是交互地执行的示例:expect -c ‘expect “\n” {send “pressed enter\n”}
-d:可以输出输出调试信息示例:expect -d ssh.exp
**expect中相关命令
spawn:启动新的进程
send:用于向进程发送字符串
expect:从进程接收字符串
interact:允许用户交互**
1. send命令
send命令接收一个字符串参数,并将该参数发送到进程
expect1.1> send “hello world\n”
hello world
2. spawn命令
上文的都是和标准输入输出进行交互,但是我们跟希望他可以和某一个进程进行交互。spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的
3.interact
可以结合spawn、expect、send自动化的完成很多任务,允许用户交互式登录
4.expect命令
expect基础知识
expect命令和send命令正好相反,expect通常是用来等待一个进程的反馈。expect可以接收一个字符串参数,也可以接收正则表达式参数。和上文的send命令结合,现在我们可以看一个最简单的交互式的例子:
expect “hi\n”
send “hello there!\n”
这两行代码的意思是:从标准输入中等到hi和换行键后,向标准输出输出hello there。
模式-动作
expect最常用的语法是来自tcl语言的模式-动作。这种语法极其灵活,后面我们会通过实验来详细介绍,先来说一下语法模式
单一分支模式语法:
expect “hi” {send “You said hi\n”}
匹配到hi后,会输出“you said hi”,并换行
多分支模式语法:
expect “hi” { send “You said hi\n” } \
“hehe” { send “Hehe yourself\n” } \
“bye” { send “Good bye\n” }
其中的\代表换行的意思,不过以上写法不太清晰,一般不用,我们一般写成如下的格式
匹配hi,hello,bye任意字符串时,执行相应输出。等同如下:
expect {
“hi” { send “You said hi\n”}
“hehe” { send “Hehe yourself\n”}
“bye” { send “Good bye\n”}
}
这里写图片描述
不过expect有一个超时时间,超时后就不能交互了
示例
为了试验效果我们进入.ssh下删除一个文件
这里写图片描述
版本1:登录后即退出
示例:用expect去监听ssh
这里写图片描述
版本2:登陆后不退出
这里写图片描述
版本3:实现不同主机间传文件
这里写图片描述
执行效果
这里写图片描述
在6上看一下有没有收到,发现已收到
这里写图片描述
版本4:Expect也支持位置参数但是写法和我们之前的不一样
scp 也有复制文件的功能,不只是传文件
这里写图片描述
这里写图片描述
这里写图片描述

以上还不够灵活,我们可以写多个Expect,进行多个不同的操作,实现多个功能
版本5(ssh5.exp):执行多个命令

这里写图片描述
示例:shell脚本调用expect语句,这个才是最终的目的
注意现在的文件名是.sh结尾的,文件名是exp.sh
这里写图片描述
执行效果:
这里写图片描述
通过以上实验可以看出,借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成,实现高效性工作

原创粉丝点击