通过用expect交互命令结合shell脚本linux定时任务完成数据远程备份
1、expect 命令介绍
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect自动交互流程:
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出.
注意该脚本能够执行的前提是安装了expect
yun install -y expect
expect常用命令总结:
spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
2、编写expect_mysqlbak.sh 脚本
#! /usr/bin/expect
set timeout 10
set host "xxxx"
set username "xxx"
set password "xxx"
set src_file [lindex $argv 0]
set dest_file "/opt/test/mysqlbak"
spawn scp $src_file $username@$host:$dest_file
expect {
"(yes/no)?" {
send "yes\n"
expect "*assword":{
send "$password\n"
}
}
"*assword":{
send "$password\n"
}
}
expect "100%"
expect eof
3、编写定时任务mysqlbackTask.sh脚本
#! /bin/bash
#目录地址
src_path="/opt/test/mysqlbak"
#当前时间yyyyMMdd
back_time=`date +%Y%m%d`
echo ${src_path}
cd $src_path
# 遍历查找到的文件
for src_file in `find -name "*${back_time}.tar.gz" -type f`
do
echo ${src_file}
#执行scp expect脚本
echo "备份时间:${back_time},备份文件:${src_file} 开始" >> ${src_path}/mysqlback.log
./expect_mysqlbak.sh ${src_file}
echo "备份时间:${back_time},备份文件:${src_file} 结束" >> ${src_path}/mysqlback.log
done
4、添加定时任务
查看定时任务列表
crontab -l
编辑定时任务
crontab -e
通过crontab -e 进入编辑模式,添加下面这行
*/1 * * * * sh /opt/test/mysqlbak/mysqlbakTask.sh >/dev/null 2>&1 &
5、定时任务执行失败查看
如果定时任务执行失败,可通过这样查看问题,定时任务执行日志输出cron.log
*/1 * * * * sh /opt/test/mysqlbak/mysqlbakTask.sh >> /opt/cron.log 2>&1
tail -f cron.log
sh: /opt/test/mysqlbak/mysqlbakTask.sh: No such file or directory
sh: /opt/tes/mysqlbak/mysqlbakTask.sh: No such file or directory
sh: /opt/test/mysqlbak/mysqlbakTask.sh: No such file or directory
sh: /opt/test/mysqlbak/mysqlbakTask.sh: No such file or directory
发现mysqlbakTask拼写错误 改为mysqlbackTask后,就ok了。