Linux Shell脚本监控目录内文件变化并自动scp方式备份

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

你可能感兴趣的:(Linux Shell脚本监控目录内文件变化并自动scp方式备份)