有两台Linux服务器A和B,假如A可以直接ssh到B,不用输入密码。A和B都有一个目录叫做/data/web/ 这下面有很多文件,当然我们不知道具体有几层子目录,假若之前A和B上该目录下的文件都是一模一样的。但现在不确定是否一致了。固需要我们写一个脚本实现这样的功能,检测A机器和B机器/data/web/目录下文件的异同,我们以A机器上的文件作为标准。比如,假若B机器少了一个a.txt文件,那我们应该能够检测出来,或者B机器上的b.txt文件有过改动,我们也应该能够检测出来(B机器上多了文件我们不用考虑)。
提示: 使用核心命令 md5sum a.txt 算出md5值,去和B机器上的比较。
# 2014-09-23
# chenpei
# Server files between detection
# 以A机器上的文件作为标准,检测B机器(前提SSH无密码登陆)
#被检测机器IP地址
IP_B="192.168.182.100"
#日志存储文件
log="/data/file.log"
#检测时间
echo "文件检测时间: `date`" >> $log
#标准A机器上的文件 (文件要从根目录开始,不然报错)
for file_A in `find /data/web -type f`
do
#文件在B机器上是否存在
file_B=`ssh $IP_B "find $file_A" 2> /dev/null`
if [ -z "$file_B" ] ; then
echo "检测机器上文件${file_A}不存在。" >> $log
continue;
fi
#文件在B机器上是否发生改变
md5_A=`md5sum $file_A | awk '{print $1}'`
md5_B=`ssh $IP_B md5sum $file_A | awk '{print $1}'`
if [[ "$md5_A" != "$md5_B" ]] ; then
echo "检测机器上文件${file_A}与标准机器上的不一样。" >> $log
fi
done
#换行
echo " " >> $log
- [root@study ~]# cat md5.sh
- #!/bin/bash
- #2014-09-24
- dir=/data/web
- m=/tmp/md5.txt
- ip=192.168.0.79
- find $dir -type f |xargs md5sum >/tmp/md5.txt
- ssh $ip "find $dir -type f |xargs md5sum >/tmp/md5_1.txt"
- scp $ip:/tmp/md5_1.txt /tmp
- for f1 in `awk '{print $2}' $m`
- do
- md5=`grep $f1 $m|awk '{print $1}'`
- md5_1=`grep $f1 /tmp/md5_1.txt|awk '{print $1}'`
- if [ -z $md5_1 ];then
- echo "$f1 not in $ip" |mail -s "error" lichao@jiangmin.com
- elif [ $md5 != $md5_1 ];then
- echo "$f1 have changed in $ip" |mail -s "error2" lichao@jiangmin.com
- fi
- done
- # cat 0924.sh
- #!/bin/bash
- # Desc: as the title
- # Writen by Jeffery.Su
- # Date: Sep,24 2014
- REMOTE_IP=172.16.7.81
- LOG=/tmp/`date +%y%m%d%H%M`_md5_err.log
- MD5_FILE=/tmp/md5.sum
- MD5_FILE_OLD=/tmp/md5.sum_`date +%H%M`
- ssh $REMOTE_IP find /data -type f |xargs md5sum > $MD5_FILE
- echo -e "$(date) begin check md5sum\n" >> $LOG
- md5sum --check $MD5_FILE| grep "FAILED" >> $LOG
- echo -e "\n$(date) check file size finished" >> $LOG
- mv $MD5_FILE $MD5_FILE_OLD
- ERR_COUNT=`grep -c FAILED $LOG`
- if [[ $ERR_COUNT -eq 0 ]];then
- echo "Congratulations! the file completeness is good!"
- else
- echo -e "The file has changed!!! please check $LOG"
- fi
{:5_121:} 写的有点乱
# 2014-09-25
IP_hostB="192.168.100.13"
file_hostA=`find /data/web`
file_hostB=`ssh $IP_B "find $file_hostA" &> /dev/null`
if [ -z "$file_hostB" ]; then
echo "$file_hostB is not exit"
exit 7
fi
md5_hostA=`md5sum $file_hostA`
md5_hostB=`ssh $IP_hostB md5sum $file_A`
if [ "$md5_hostA" = "$md5_B" ]; then
echo "equal"
else "not equal"
fi
- #!/bin/bash
- ## This script is for differ files in machine A and machine B.use files'md5.
- ## Written by Louis at 2014/09/25 19:20
- dir=/data/web
- ip=192.168.0.102
- ssh 192.168.0.102 "find $dir -type f|xargs md5sum" > /tmp/md5_B
- scp 192.168.0.102:/tmp/md5_B /tmp/
- for file in `find $dir -type f`; do
- if grep -q $file /tmp/md5_B; then
- md5sum_B=`awk '$2=="'$file'" {print $1}' /tmp/md5_B`
- echo $md5sum_B
- md5sum_A=`md5sum $file|awk '{print $1}'`
- if [ "$md5sum_B" != "$md5sum_A" ]; then
- echo $file >> /tmp/change
- fi
- else
- echo $file >> /tmp/lack
- fi
- done
- if [ ! -z /tmp/change ]; then
- echo "Machine B has changed these files:" `cat /tmp/change|xargs`
- rm -rf /tmp/change
- fi
- if [ ! -z /tmp/lack ]; then
- echo "Machine B less these files:" `cat /tmp/lack|xargs`
- rm -rf /tmp/lack
- fi
机器B的ip:192.168.0.102
将B机器/data/web的所有文件的md5值计算出并存放于一个文本md5_B,将md5_B传送回A机器,逐一比较A机器中/data/web中的文件,如果文件不存在于md5_B文件中,则表示此文件在B机器缺少;否则计算A机器中文件的md5值,与md5_B文件中对应md5值比较。
bb=B---`ls /data/web/`
while $bb
if [md5sum $bb -le md5sum $aa -o md5sum $bb -ge md5sum $aa ] ;
then echo $bb;
fi
- #!/bin/bash
- #name:check_rfile.sh
- #author:ww
- #check files in local and remote
- a_ip=192.168.243.102
- b_ip=192.168.243.216
- basedir=/data/web
- files=`find $basedir -type f`
- for file in $files
- do
- a_file_md5=`md5sum $file`
- b_file_md5=`ssh root@$b_ip "md5sum $file"`
- echo $a_file_md5 $b_file_md5
- if [ "$a_file_md5" == "$b_file_md5" ]
- then
- echo $file" a and b is same"
- else
- scp $file root@$b_ip:$file
- if [ $? -eq 1 ]
- then
- b_filedir=`dirname $file`
- echo "filedir:"$b_filedir
- ssh root@$b_ip "mkdir -p $b_filedir"
- if [ $? -eq 0 ]
- then
- scp $file root@$b_ip:$file
- fi
- fi
- fi
- done
find /data/web/ -type f > A.txt
ssh B;find /data/web/ -type f > B.txt
scp B.txt root@A:/data/web/
for fA in `cat A.txt`
do
nA=`md5sum $fA`
for fB in `cat md5sum B.txt`
do
nB=`md5sum $fB`
if [ $fA -ne $fB ]
then
echo "something is different."
fi
done
done
#!/bin/bash
dir=/data/web
file_a=`bin/find $dir -type f |awk -F '/' '{print $NF}'`
ip_b=192.168.2.91
install_md5sum () {
c=`which md5sum`
if [ $c != "/usr/bin/md5sum" ]
then
yum install -y coreutils >/dev/null 2>&1
fi
}
install_md5sum
/usr/bin/md5sum $file_a >>/tmp/md5_a.txt
/usr/bin/rsync -av /tmp/md5_a.txt root@$ip_b:/tmp
ssh $ip_b
install_md5sum
for file_b in $file_a
do
if [ -e $dir/$file_b ]
then
echo "$file_b on $ip_b is not exist"
exit 1
else
d=`/usr/bin/md5sum $file_b |awk '{print $1}'`
e=`awk '$2=="$file_b" {print $1}'/tmp/md5_a.txt`
[ $d -eq $e ] || echo "data in $file_b has changed"
fi
done
#!/bin/bash
#2017-02-25
ip_b="192.168.112.153"
basedir=/data/rsync_dir/
file_A=/root/testdev/file_A.txt #统计在web a机器的文件和md5值
[ -e $file_A ]||touch $file_A
>$file_A
file_not=/root/testdev/file_not.txt #统计web b机器缺少的文件
[ -e $file_not ] || touch $file_not
>$file_not
file_change=/root/testdev/file_change.txt #统计web b机器修改过的文件
[ -e $file_change ] || touch $file_change
>$file_change
for i in `find $basedir -type f`;do
m5=`md5sum $i`
echo "$m5" >> $file_A
done
for i in `awk '{print $2}' $file_A`;do
echo "web_A: $i" #绝对路径的文件名
file_re=`ssh $ip_b "find $i" 2>/dev/null`
if [ "$i" != "$file_re" ];then
echo "Web_B not: $i" >> $file_not
elif [ "$i" == "$file_re" ];then
md5_A=`md5sum $i`
md5_B=`ssh $ip_b "md5sum $file_re" 2>/dev/null`
if [ "$md5_A" != "$md5_B" ];then
echo "Web_B chage: $i" >> $file_change
fi
fi
done
编辑回复