诉求:最近项目出于安全要求对文件服务器做备份,于是额外再部署一台sftp服务器,用作备份服务器。
实现目标:通过shell脚本监控目录内变化文件并自动增量备份
一、实现方式
1.在两台服务器上分别部署sftp服务
A文件服务器为主,B文件服务器为备份文件服务器
在A,B文件服务器上分别创建目录/home/sftp/data/recruit/data/
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服务器上查看修改文件是否被传输过来了