Expect介绍
expect是一个用来实现自动交互功能的软件套件,是基于TCL的脚本编程工具语言。
为什么要使用Expect
在现今的运维中,自动化运维已经成为运维的主流趋势,但是在很多情况下,执行系统命令或程序时,系统会以交互式的形式要求运维人员必须输入指定字符之后才能继续执行命令。例如,为用户设置密码时,一般情况下就需要手动输入2次密码。再比如使用SSH远程连接服务器时,第一次连接要和系统实现俩次交互输入:
如图:
安装Expect软件
[root@zh ~]# yum install -y expect
下面利用Expect的功能实现自动交互,发送密码并执行上述ssh命令(由于已经执行过一次ssh了,yes的交互就不会再出现了)
[root@zh ~]# cat test.exp # <==扩展名使用exp代表是Expect脚本
#!/usr/bin/expect # <==脚本开头解释器,和shell类似,表示程序使用Expect解析
spawn ssh root@192.168.1.141 uptime # <==执行ssh命令(注意开头必须要有spawn,否则无法实现交互)
expect "*password:" #<==利用Expect获取执行上述ssh命令输出的字符串是否为期待的字符串 *password,这里的*是通配符
send "1\n" #<==当获取到期待的字符串password时,则发送 1 密码给系统,\n为换行
expect eof #<==处理完毕后结束Expect
执行Expect脚本
[root@zh ~]# expect test.exp
spawn ssh root@192.168.1.141 uptime
root@192.168.1.141's password: #<==这里不需要手动输入密码了
01:19:24 up 43 min, 2 users, load average: 0.00, 0.01, 0.05
spawn 命令
spawn 命令的语法为:
spawn [选项] [需要自动交互的命令或程序]
例如:
spawn ssh root@192.168.1.141 uptime
expect 命令
expect 命令语法
expect 表达式 [动作]
示例如下:
spawn ssh root@192.168.1.141 uptime
expect "*password" {send "123456\r"}
说明
1)exp_send和send类似,后面的 \r(回车) 、\n(换行)
2)expect {} , 类似多行expect。
3)匹配多个字符串,需要在每次匹配并执行动作后,加上exp_continue。