linux下A服务器文件自动备份到B服务器(SCP+EXPECT+CROTAB)

1.备份原理2.expect安装和说明

3.具体代码

4.crontab定时运行脚本

1.备份原理

本人小白,复杂的shell不会写,所以只能利用几种简单的代码加上一定的逻辑,来实现服务器的文件备份。

A服务器每天对文件夹和数据库进行本地备份,保留最近10天备份

A服务器每天通过scp命令向B服务器发送当天备份

A服务器每月1号通过scp命令向B服务器发送当天备份

B服务器每天清理10天前的备份(为了节约空间)

 

2.expect安装和说明

expect时用与提供自动交互的工具。比如如果想要用ssh登陆服务器,每次都输入密码你觉得麻烦,那你就可以使用expect来做自动交互,这样的话就不用每次都输入密码了。

本文利用expect来进行scp运行时的密码输入(使用密钥进行传输无需密码,也就无需expect,本文暂不涉及密钥)

yum install expect -y  #安装expect
#以下是expect的用法:
spawn 命令   #这个命令是你在linux命令行要执行的命令
expect "*password:" send "123\r"  #如果弹出*password,则自动输入123\r
expect eof   #结束expect匹配

3.具体代码

少废话,上代码:

A服务器:vim pmhuiyilu.sh (网站和数据库进行本地备份并清理10天前的备份)

#!/usr/bin/bash    
mysqldump -uroot -p密码 数据库名 | gzip > /backup/pmhuiyilu/sql_pmhuiyilu_$(date +%Y%m%d_%H%M%S).sql.gz 
zip -r /backup/pmhuiyilu/web_pmhuiyilu_$(date +%Y%m%d_%H%M%S).zip /web/pmhuiyilu/
workdir="/backup/pmhuiyilu/" 
do_delete() 
{ 
find $workdir -name '*.sql.gz' -and -mtime +10 -type f -delete 
if [ $? -eq 0 ];then 
echo $date delete $dir success! 
else 
echo $date delete $dir FAILD! 
fi 
find $workdir -name '*.zip' -and -mtime +10 -type f -delete 
if [ $? -eq 0 ];then 
echo $date delete $dir success! 
else 
echo $date delete $dir FAILD! 
fi 
} 
do_delete

A服务器:cpaliyun.sh 每天本地备份一次,用于发送到B服务器用

#!/usr/bin/bash    
rm /backup/aliyun/* -f
mysqldump -uroot -p密码 数据库名 | gzip > /backup/aliyun/sql_pmhuiyilu_$(date +%Y%m%d_%H%M%S).sql.gz 
zip -r /backup/aliyun/web_pmhuiyilu_$(date +%Y%m%d_%H%M%S).zip /web/pmhuiyilu/

A服务器:vim scp.sh (利用scp进行文件夹的发送,第一次运行可能要输入yes/no,本脚本并未做处理,可手动运行一遍手动输入yes)每天发送一次到B服务器按天备份的目录中

#!/usr/bin/env expect
/usr/bin/expect <<-EOF
set time 300
spawn scp -r 要发送的文件夹  root@B服务器IP:B服务器按天存储的地址
expect {
"root@B服务器IP's password:" { send "B服务器root密码\r" }
}

set timeout 5000
expect eof
EOF

A服务器:vim scp_month.sh   每月发送一次到B服务器按月备份的目录中

#!/usr/bin/env expect
/usr/bin/expect <<-EOF
set time 300
spawn scp -r 要发送的文件夹  root@B服务器IP:B服务器按月备份的存储地址
expect {
"root@B服务器IP's password:" { send "B服务器root密码\r" }
}

set timeout 5000
expect eof
EOF

B服务器:remove.sh(每天清理一次文件夹,只保留10天内的备份)

#!/bin/bash    
workdir="/备份地址" 
do_delete() 
{ 
find $workdir -name '*.sql.gz' -and -mtime +10 -type f -delete 
if [ $? -eq 0 ];then 
echo $date delete $dir success! 
else 
echo $date delete $dir FAILD! 
fi 
find $workdir -name '*.zip' -and -mtime +10 -type f -delete 
if [ $? -eq 0 ];then 
echo $date delete $dir success! 
else 
echo $date delete $dir FAILD! 
fi 
} 
do_delete

 

4.crontab定时运行脚本

crontab -e   #打开crontab定时器(关于crontab之前有文章写过,可参考)

A服务器每天4点运行cpaliyun.sh脚本进行本地备份,每天4点10分运行scp.sh脚本进行发送到B服务器按天备份文件夹,每月1号的6点运行scp.sh脚本进行发送到B服务器按月备份文件夹

B服务器每天运行remove脚本对按天接受的文件夹进行清理(只保留最近10天)

0 8 * * * sh /home/remove.sh

 


 

发表评论

电子邮件地址不会被公开。