Linux脚本使用scp方式增量备份

诉求:最近项目出于安全要求对文件服务器做备份,于是额外再部署一台sftp服务器,用作备份服务器。

实现目标:通过shell脚本监控目录内变化文件并自动增量备份

一、实现方式

1.在两台服务器上分别部署sftp服务

A文件服务器为主,B文件服务器为备份文件服务器

在A,B文件服务器上分别创建目录/home/sftp/data/recruit/data/

参考:Docker部署sftp-CSDN博客

2.在A文件服务器上安装expect组件

前提:挂在yum源,可参考:Centos7 挂载 ISO镜像_centos7挂载iso镜像文件-CSDN博客

配置好yum源后,安装expect组件

yum install -y ctl

yum install -y expect

3.在A文件服务器编写备份脚本wx_file_backup.sh

#!/bin/bash
#此脚本用于检测linux系统重要文件夹内的文件是否被改动,如果改动则自动SCP上传
#建议用crontab定时任务执行此脚本,定时执行
#Ver:1.0

#定义验证文件所在目录
FileDir='/home/sftp/data/recruit/'
#定义需要监控的文件目录。
CheckDir='/home/sftp/data/recruit/data/'
#定义远程地址
IPAddress="10.128.XXX.XX"
#定义远程端口
rmport=22
#定义远程服务器的绝对路径
ShareDir='/home/sftp/data/recruit/data/'
#定义远程SSH账号和密码
motuser='root'
motpass='XXXX@XXX'
#定义首次使用标识
isbegin=0
#生成所定义需验证的文件样本日志函数
OldFile () 
{
    for i in ${CheckDir[@]}
    do
        echo "old---${i}"
        find ${i} -mmin -30 -type f |xargs md5sum >> ${FileDir}/old.log
    done
}
#
NewFile () 
{
    for i in ${CheckDir[@]}
    do
        echo "new ---${i}"
        find ${i} -mmin -30 -type f |xargs md5sum >> ${FileDir}/new.log
    done
}
#生成所定义文件新日志函数
if [ ! -d ${FileDir} ]
then
    mkdir ${FileDir}
fi

#首次使用,假如验证文件不存在则创建一个空文件
if [ ! -f ${FileDir}/old.log ]
then
    cat /dev/null > ${FileDir}/old.log
    isbegin=1
fi

#检测远程网络及SSH服务情况。
#probe=$(telnet $IPAddress $rmport | grep "SSH" | grep -v grep)
#echo $probe
#if [ -z "$probe" ];then
#    echo "$IPAddress:$rmport >> 远程服务器SSH未开启。"
#    exit
#else
    #生成新验证日志
    NewFile
    #新验证日志与样本日志进行比较
    diff ${FileDir}/new.log ${FileDir}/old.log >${FileDir}/diff.log
    Status=$?
    #假如比较结果有变化,则备份变化文件
    if [ ${Status} -ne 0 ]
    then
        for up_file in `grep '<' ${FileDir}/diff.log |awk '{print $3}'`
        do
            up_path=${up_file%/*}
            bk_path=${up_path##${CheckDir}}
                        echo "bk_path= $bk_path"
            #首次使用则创建远程目录
            if [ ${isbegin} -ne 0 ];then
                expect <<-sEOF
                spawn ssh -o StrictHostKeyChecking=no  ${motuser}@${IPAddress} {[ -d ${ShareDir}${bk_path} ] && exit || mkdir -p ${ShareDir}${bk_path}}
                set time -1            
                expect {
                    "*yes/no" { send "yes\r"; exp_continue }
                    "*password:" { send "$motpass\r" }
                }
                expect eof
                exit
                sEOF
            fi
                       
           echo "bk_path=${ShareDir}${bk_path}"
           echo "up_file=${ShareDir}${bk_path}/${up_file##*/}"


            #SCP上传变化文件
            expect <<-xEOF

           #创建不存在文件夹
           spawn ssh -o StrictHostKeyChecking=no ${motuser}@${IPAddress} {[ -d ${ShareDir}${bk_path} ] && exit || mkdir -p ${ShareDir}${bk_path}}
                                set time -1
                                expect {
                                    "*yes/no" { send "yes\r"; exp_continue }
                                    "*password:" { send "$motpass\r" }
                                }

                       
            set time -1
            spawn scp -r -o StrictHostKeyChecking=no ${up_file} ${motuser}@${IPAddress}:${ShareDir}${bk_path}/${up_file##*/}
            expect {
            "*yes/no" { send "yes\r"; exp_continue }
            "*password:" { send "$motpass\r" }
            }
            expect eof
            exit
            xEOF

        done
    fi

    #清除新旧日志,把比较结果进行备份
    mv -f ${FileDir}/diff.log ${FileDir}/diff$(date +%F__%T).log
    cat /dev/null > ${FileDir}/old.log
    cat /dev/null > ${FileDir}/new.log

    #重新生成样本日志
    OldFile
#fi
#删除目录内30天以前的比较结果备份文件
find ${FileDir} -type f -mtime +30 |xargs rm -f

#//END OF FILE///

portdet.sh 放置与上同目录内 

#!/bin/bash
#此脚本用于探测远程服务器是否开启SSH服务,支持端口转发模式的服务器
#ver 1.0

#假如没有安装telnet则安装
if [ ! -f /usr/bin/telnet ]
then
    apt -y install telnet
fi
#探测服务器是否开启SSH服务
telnet $1 $2 | grep "SSH" &
sleep 1
press=$(ps aux | grep "telnet" | grep -v grep |awk '{print $2}')
if [ ! -z $press ];then
    kill -9 $press
fi
#//END OF FILE///

4.在A文件服务器编写定时任务脚本

输入命令:crontab -e 

#添加 每10分钟执行wx_file_backup.sh脚本

*/10 * * * * root /home/wx_file_backup.sh > /dev/null 2>&1

#这个用来测试定时任务是否执行了

*/1 * * * * root echo 123 >> /home/test.log

5.验证增量备份脚本是否生效

在B服务器上查看修改文件是否被传输过来了 

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值