Linux Shell脚本监控目录内文件变化并自动scp方式备份
最近有个小项目,需要实时监测某文件夹的文件变化,当有变化时自动上传变化文件,在网上查找了大量的资料参考,加以改进最终达到了所需目的,在此分享出来,也感谢众多的前辈们~~~
整个功能的实现,需要两台Linux机器,Ubuntu、Deepin、Manjaro等等均可,一台作为主机,另一台作为备份机,不同的系统代码可能需要微调。
废话不多说,直接上代码,都有注解不难看懂:
AutoScpSyncFolder.sh
#!/bin/bash
#此脚本用于检测linux系统重要文件夹内的文件是否被改动,如果改动则自动SCP上传
#建议用crontab定时任务执行此脚本,定时执行
#Ver:1.0
#定义验证文件所在目录
FileDir='/home/CheckFile'
#定义需要监控的文件目录。
CheckDir='/media/_dde_data/myfiles'
#定义远程地址
IPAddress="192.168.3.123"
#定义远程端口
rmport=10022
#定义远程服务器的绝对路径
ShareDir='/home/mytest'
#定义远程SSH账号和密码
motuser='mytest'
motpass='*******'
#定义首次使用标识
isbegin=0
#生成所定义需验证的文件样本日志函数
OldFile ()
{
for i in ${CheckDir[@]}
do
find ${i} -type f |xargs md5sum >> ${FileDir}/old.log
done
}
#
NewFile ()
{
for i in ${CheckDir[@]}
do
find ${i} -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=$(./portdet.sh $IPAddress $rmport | grep "SSH" | grep -v grep)
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}}
#首次使用则创建远程目录
if [ ${isbegin} -ne 0 ];then
expect <<-sEOF
spawn ssh -o StrictHostKeyChecking=no -p${rmport} ${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
#SCP上传变化文件
expect <<-xEOF
set time -1
spawn scp -r -o StrictHostKeyChecking=no -p${rmport} ${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///
以上代码完毕,修改相应的配置之后,先手动测试一下,没问题便可设置定时任务:
sudo vim /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/5 * * * * root /home/AutoSyncFolder/AutoScpSyncFolder.sh >/dev/null
#
代表每5分钟执行一次
*/5 * * * * root /home/AutoSyncFolder/AutoScpSyncFolder.sh >/dev/null