1.简介
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
2.expect自动交互流程
1)spawn启动指定进程
2)expect获取指定关键字
3)send向指定程序发送指定字符
4)执行完成退出
3.常用命令
命令 | 描述 |
---|---|
spawn | 交互程序开始后面跟命令或者指定程序 |
expect | 获取匹配信息匹配成功则执行expect后面的程序动作 |
send exp_send | 用于发送指定的字符串信息 |
exp_continue | 在expect中多次匹配就需要用到 |
send_user | 用来打印输出 相当于shell中的echo |
exit | 退出expect脚本 |
eof | expect执行结束 退出 |
set | 定义变量 |
puts | 输出变量 |
set timeout | 设置超时时间 |
4.应用举例
一台机器向多个机器推送文件
脚本1:scp.sh实现推送过程
#!/usr/bin/expect/bin/expect -f #此行根据expect安装路径更改
set ip [lindex $argv 0] #ip读取配置文件获取
set user root #设置被推送用户名
set passwd [lindex $argv 1] #实际生产中服务器密码是不一致的这里采取读配置文件来获取密码
set dir_1 /home/root/test/ #推送文件路径
set dir_2 /tmp/ #被推送服务器接收文件路径
set file_name test.txt #推送文件的名称
set timeout 100 #设置超时时间可根据实际情况修改
spawn scp $dir_1$file_name $user@$ip:$dir_2
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$passwd\r"}
}
expect eof
exit
脚本2:run.sh读取配置文件传参数
#!/bin/bash
for ((i=1;i<=$(cat host.ini|wc -l);i++)); #host.ini为配置被推送主机的ip和密码文件
do
us=$(cat host.ini | sed -n "$(i)"p | awk '{print $1}'); #获取配置文件IP信息
ps=$(cat host.ini | sed -n "$(i)"p | awk '{print $2}'); #获取配置文件密码
./scp.sh $us $ps
done
脚本3:host.ini配置被推送主机,第一列为主机ip,第二列为对应的密码,中间空格隔开
192.168.212.21 Abcd1234
192.168.212.22 gher9087
192.168.212.23 jjgt5632
5.总结
3个脚本和被推送文件需要在同级目录下执行,若不在同级目录更改脚本中路径即可,本例中主机配置文件host.ini是明文密码存在极大安全隐患。实际生产环境有更安全的工具(如:ansible)实现文件推送,本例仅为新手学习实践练手。