使用crontab与expect进行定时推送数据包
安装expect
yum install -y expect
编写脚本目标
- 本地备份:实现本地mysql数据库自动备份(每天晚上23:25执行)
- 推送:将本地自动备份脚本推送到目标sftp服务器的指定目录(每天晚上23:50执行)
编写expect脚本
- 编写本地自动备份脚本 :在/data/back下新建一个mysql.sh脚本,内容如下:
#!/bin/bash
DATE=`date +%Y%m%d_%H%M%S`
mysqldump -uroot -p******* 数据库名字>/data/back/wcm_special_${DATE}.sql
为此脚本授可执行权限:
chmod -R 755 mysql.sh
- 定时启动本地备份脚本:使用crontab做定时任务。
crontab -e
添加一行内容,表示每天晚上23点25分执行mysql.sh脚本
25 23 * * * /data/back/mysql.sh
重启crontab
service crond restart
3.编写expect脚本:在/data/back/目录下新建一个expect_mysql.sh脚本,脚本内容如下:
#!/usr/bin/expect -f
set date [exec date "+%Y%m%d"]
set timeout -1
spawn sftp 远程服务器访问用户名@xxx.xxx.xx.xx #远程服务器访问用户名和ip
expect {
"*yes/no*" { send "yes\r"; exp_continue }
"*assword:" { send "远程服务器访问密码\r" } #远程服务器访问密码
}
expect "sftp>"
send "cd /map/zxwtk/mysql\r" #远程服务器推送目录
expect "sftp>"
send "lcd /data/back\r" #本地文件目录
expect "sftp>"
send "put wcm_special_${date}*.sql*()\r" #本地推送文件名(这里使用按日期匹配)
expect "sftp>"
send "ls -la\r"
expect "sftp>"
send "bye\r"
interact
exit
- **为expect脚本授权 **:chmod -R 755 expect_mysql.sh
- **测试本地expect脚本 **:在/data/back目录下,运行
./expect_mysql.sh
推送成功。
- 使用定时任务执行expect脚本 :编辑crontab ,
crontab -e
增加以下语句,表示每天23点50分执行expect_mysql.sh脚本:
50 23 * * * /data/back/expect_mysql.sh
*/2 * * * * /data/back/expect_mysql.sh #方便测试,增加这一行,测试成功则删除本行,表示每两分钟执行一次脚本
观察发现数据包并没有推送过去,使用sh命令运行:
如上,发现报错。经过查找,发现需要设置crontab的运行目录:
6. 设置crontab的运行目录 :
vim /etc/crontab
增加红框中的内容。然后再进行测试,发现成功。