expect是一个用来处理交互的命令。借助于expect我们可以把交互过程写在一个脚本上,使之自动化完成。

expect最核心的四个命令:

send:用于向进程发送字符串
except:从进程接收字符串
spawn:打开一个新的进程
interact:保持交互的状态

首先一个简单的脚本:

#!/usr/bin/expect            #定义解释器和shell一样
set user [lindex $argv 0]    #定义变量
set host [lindex $argv 1]    # 
set passwd "8023jun12"
spawn ssh $user@$host         #打开一个ssh进程
expect "password:"            #捕捉到“password:"字符串时,调用send发送字符串
send "$passwd\r"
interact                     #ssh登录后保持登录状态,若没有此语句脚本执行完之后就会返回

执行脚本:

[root@slave expect]# ./1.sh root 192.168.1.120
spawn ssh root@192.168.1.120
root@192.168.1.120's password: 
Last login: Tue Dec 27 07:27:07 2016 from slave
[root@master ~]#

可以设置超时时间:

set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒

expect的命令行参数

[lindex $argv n]获得index为n的参数(index从0开始计算)
$argc为命令行参数的个数
[lrange $argv 0 0]表示第一个参数
[lrange $argv 0 3]表示第1到第3个参数