适用于WEB应用双机负载,比较应用目录是否一致,脚本执行前已经做好了ssh密钥认证,本例用第一台机器的目录为标准进行比较
[root@v73 tmp]# cat /root/diffdir3.sh
#!/bin/bash
if [ $# != 4 ]; then #脚本接收4个参数,源IP,源目录,目的IP,目的目录,目录必须用/的方式结束,不足补齐
echo "pls input four args"
exit 1;
fi
md51name=`echo $2 | sed 's#\/#.#g'`.md5sums1 #拼接出存放文件的相对路径和MD5值的文件名
md52name=`echo $4 | sed 's#\/#.#g'`.md5sums2
ssh -n $1 "find $2 -type f|xargs md5sum|"sed s#$2##g" > /tmp/$md51name" #计算出存放文件的相对路径和MD5值,已经去掉了两个目录的绝对路径,这样可比较两个不同路径下的目录
scp $1:/tmp/$md51name /tmp/ #拷贝这个文件到执行脚本机器的/tmp目录
ssh -n $3 "find $4 -type f|xargs md5sum|"sed s#$4##g" > /tmp/$md52name"
scp $3:/tmp/$md52name /tmp/
while read line1 #以源目录为标准,开始比较,在done <<< "$(cat /tmp/$md51name)"已经指定
do
flags=0 #标记文件是否找到,在嵌套的循环中会引用
files1=`echo $line1 | cut -d" " -f2` #源目录文件的相对路径
while read line2 #读取目的目录的信息,在done <<< "$(cat /tmp/$md52name)"已经指定
do
files2=`echo $line2 | cut -d" " -f2` #目的目录文件的相对路径
if [ $files1 = $files2 ]; then #找到源目相同的文件
#标记文件存在找到,采用这种方式引用变量是因为变量经过管道的传递,使用变量常用的方式赋值将不能通过while的管道传递变量
flags=$(($flags+1))
m51=`echo $line1 | cut -d" " -f1` #文件相同比较MD5值
m52=`echo $line2 | cut -d" " -f1`
[ $m51 != $m52 ] && echo "$files1 md5chg."
break #找到相同的文件并且比较MD5值之后马上跳出此次循环,节省资源,开始匹配下一个文件
fi
done <<< "$(cat /tmp/$md52name)"
[ $flags != 1 ] && echo "$files1 notexists."
done <<< "$(cat /tmp/$md51name)"
执行效果: