1.什么是expect
expect是基于TCL的相对简单的一个免费的脚本编程工具语言,用来实现自动和交互式任务程序语言进行通信,无需人工干预,其作者定义为:expect is a software suite for automating interactive tools
2.expect程序的工作流程
except的工作流程可以理解为: spawn启动进程 --> expect期待关键字 --> send向进程发送字符 --> 退出结束
3.安装except
yum install expect -y
4.一个小实例
#!/usr/bin/expect
spawn ssh -p22 root@192.168.1.25 /usr/sbin/ifconfig -a
set timeout 60
expect "*password:" {send "root1234\n"}
expect eof
exit
5.expect语法
expect命令的语法:
命令 [选项] 参数
5.1 spwan
spwan命令是expect的初始命令,它启动一个进程,之后所有expect操作都在这个进程中进行,其使用方法如下:
spwan ssh root@192.168.1.26
在spwan命令后面,直接加上要启动的进程、命令等信息,除此之外,还支持其他选项:
-open 启动文件进程,具体说明请自行查阅
-ignore 忽略某些信号,具体说明请自行查阅
5.2 expect
使用方法:
expect 表达式 动作 表达式 动作 ... ...
expect命令用于等候一个相匹配内容的输出,一旦匹配则执行expect后面的动作命令,这个命令接收几个特有参数,用的最多的就是-re,表示使用正则表达式进行匹配,如下:
spwan ssh root@192.168.1.26
expect -re ".*password" {send "root1234\r"}
expect是依附与spwan命令的,当执行ssh命令后,expect就会匹配命令执行后的输出,然后执行expect后面包含在{}中的send或exp_send动作,匹配及动作可以放在下一行,就可以省略{},如下:
spwan ssh root@192.168.1.26
expect -re ".*password"
send "root1234\r"
5.3 exp_send和send
在上面的介绍中,我们看到了exp_send命令的使用,exp_send是expect中的动作,send和其作用一样。exp_send命令可以发送一些特殊符号:
\r 回车
\n 换行
\t 制表符
send命令还有几个可选的参数:
-i 指定spwan_id, 这个参数用来向不同的spwan_id的进程发送命令,是进行多进程控制的关键参数。
-s s代表slowly,也就是控制发送的速度,这个参数使用的时候要与expect中的变量send_slow向关联
5.4 exp_continue
这个命令一般用在动作中,它被使用的条件比较苛刻,例子:
#!/usr/bin/expect
spwan ssh -p22 root@192.168.1.26 /usr/sbin/ifconfig eth0
set timeout 60
expect {
-timeout 1
"yes/no" { exp_send "yes\r"; exp_continue }
"*password:" { exp_send "root1234\r" }
timeout { puts "expect was timeout"; return }
}
expect eof
exit
个人理解:spwan后面的命令的输出,从第一行开始进行expect遍历匹配,若匹配则执行动作,不匹配则进行下条匹配,而exp_continue的作用是,若不匹配则跳过此行输出,并进行第二行输出进行expect的匹配
5.5 send_user
send_user用于把后面的参数输出到标准输出中去,默认的send、exp_send都是将参数输出到程序中去,用法:
send_user "please input password:"
这样就可以在标准输出中打印please input password:字符了。
#!/usr/bin/expect
if { $argc != 3 } {
send_user "usage: expect scp-expect.exp file host dir\n"
exit
}
5.6 exit
exit命令功能很简单,就是直接退出脚本,但可以利用这个命令做一些扫尾工作,如:
exit -onexit {
exec rm $tmpfile
send_user "Good Bye\n"
}
6. expect变量
expect中有很多有用的变量,他们的使用方法与TCL中的变量相同,如:
set 变量名 变量值 # 设置变量的方法
puts $变量名 # 读取变量的方法
# define var
set file [lindex $argv 0] # 取命令行参数的
set host [lindex $argv 1]
set dir [lindex $argv 2]
set password "root1234"
7. expcct关键字
expect中的关键字用于匹配过程,代表某些特殊含义或状态,一般用于expect命令中而不能在外面使用,也可以理解为事件,如:
expect eof {}
7.1 eof
eof(end-of-file)关键字用于匹配结束符,比如文件、ftp传输停止等,在这个关键字后跟上动作来做进一步的控制,特别是ftp交互操作方面,他的作用很大,如:
spawn ftp root@192.168.1.26
expect {
"password:" {exp_send "root1234"}
eof { ftp connect close }
}
interact { }
interact也是关键字,可以是当前停留在服务端,交互模式使用
7.2 timeout
timeout是expect中的一个重要变量,它是一个全局性的时间控制开关,你可以通过为这个变量赋值来规定整个expect操作的时间,注意这个变量是服务与expect全局的。例子:
set timeout 60
spawn ssh root@192.168.1.26
expect "*password:" { send "root1234\n" }
expect timeout {puts "timeout"; return }
先将超时间设置为60秒,当程序阻塞到60秒,就会激活timeout动作。
另一种设置timeout的方法,如下:
spwan ssh root@192.168.1.26
expect {
-timeout 60
-re "password:" {exp_send "root1234\r"}
-re "TopsecOS#" { }
timeout { puts "timeout"; return }
}