脚本实现目的:

    通过脚本检测相应的文件是否发生改变。

脚本思路:

    使用文件的md5值作为检测依据,若文件发生变化,则记录日志,并备份发生改变的文件。

    通过配置文件的方式指定文件传递给脚本,以方便批量部署。

脚本内容:

#!/bin/bash
#use for check file change
#create in 2013-06-07
#Last modify is 2014-04-09
source ~/.bash_profile &> /dev/null

cd /tol/script/
ls /tol/script/logs &> /dev/null || /bin/mkdir -p /tol/script/logs
bakdir=/tol/backup/conf_bak
ls $bakdir &> /dev/null || /bin/mkdir -p $bakdir
dt2=`date +"%F"`
log="/tol/script/logs/md5_check-$dt2.log"
host=`/sbin/ifconfig |grep "inet addr"|cut -d ':' -f2 |awk '{print $1}'|head -1`
conf=/tol/script/md5_check.conf
oldlist=/tol/script/md5_check.old
newlist=/tol/script/md5_check.new

if test ! -f $conf ; then
	echo "the $conf does not exist"
	exit 0	
else

if test ! -f $oldlist ; then
	for f in `cat $conf`
	do
	/usr/bin/md5sum $f >> $oldlist
	done
	#/usr/bin/chattr +i $oldlist
else
	for f in `cat $conf`
	do
	dt=`date +"%F_%T"`
	/usr/bin/md5sum $f > $newlist
	old=`cat $oldlist |/bin/grep "$f" |/bin/awk '{print $1}'`
	new=`cat $newlist |/bin/grep "$f" |/bin/awk '{print $1}'`
	if test -z "$old" ; then
		#/usr/bin/chattr -i $oldlist
		/usr/bin/md5sum $f >> $oldlist
		#/usr/bin/chattr +i $oldlist
		#exit 0
	else	
		if test "$new" != "$old" ; then
			tar -jpcf $bakdir/`basename $f`_$dt.bz2 $f &> /dev/null
			sed -i "s/$old/$new/g" $oldlist

			echo "$dt the $host $f was changed" >> $log
			echo "#" >> $log
			echo "The $f changed time:" >> $log
			/bin/ls -l --time-style=long-iso $f >> $log
			echo "#" >> $log
			echo "The $host last 3 login user:" >> $log
			/usr/bin/last |/usr/bin/head -3 >> $log
			echo "#" >> $log
			#echo "$dt the $host $f was changed" |mail -s "check $host $f" jiank
		#else
		#	echo "$dt the $host $f is normal" >> $log
		fi

	fi
	done
fi

fi

脚本配置文件:

/etc/passwd

/etc/group

/etc/shadow


md5sum命令的常见用法:

md5sum 文件名#查看某一个文件的MD5值

md5sum *.html#查看当前目录下某一类型文件的MD5值,这里是html

md5sum *#查看当前目录下所有文件的MD5值

md5sum -c 保存MD5值的文件名#根据保存MD5值的文件里的内容比对文件是否有变化

find /dir -type f -print0|xargs -0 md5sum > ~/md5  #查看某个目录下所有文件的MD5值