6. 检测两台机器上文件的差异

生产环境下,web服务器大多会做负载均衡,所以有多台机器上跑着同样的web程序代码。如果严格按照规范流程上线,即不人为特意更改代码,那么这多台机器上的代码一定是一样的,并不会存在两台机器同一个文件内容不同的情况。本案例的需求就是要检查两台机器同一个文件的差异,毕竟我们不确定服务器上的代码是否有人为改动过。

具体要求如下:

1)两台机器A和B,检查目标目录为 /data/wwwroot/www.abc.com ,路径一致;

2)需要过滤 uploads、tmp 两个目录,这两个目录的文件不需要对比差异;

3)以A机器上的文件作为标准,B机器少了文件和改了文件需要记录,多了文件不用考虑;

4)假设A机器可以免密登录B机器;

5)把有差异和缺少的文件列表记录到 /data/change.log 。

参考脚本如下:

#!/bin/bash
##对比两机器上的文件差异

#假设B机器IP为192.168.0.110
B_ip=192.168.0.110
dir=/data/wwwroot/www.abc.com

#首先检查 /tmp/mkd5.list 文件是否存在,存在的话就删除掉,避免影响后续操作
[ -f /tmp/md5.list ] && rm -f /tmp/md5.list

#把除了uploads和tmp目录外的其它目录下的所有文件全部列出来
cd $dir
find . \(-path "./uploads*" -o -path "-/tmp*" \) -prune -o -type f > /tmp/file.list

#用while循环,求出所有文件的md5值,并写入一个文件里
cat /tmp/file.list |while read line
do
    md5sum $line
done > /tmp/md5.list

#将 /tmp/md5.list 拷贝到B机器
scp /tmp/md5.list $B_ip:/tmp/

#判断 /tmp/check_md5.sh 文件是否存在,存在的话就删除掉
[ -f /tmp/check_md5.sh ] && rm -f /tmp/check_md5.sh

#用Here Document编写 check_md5.sh 脚本内容
cat << EOF > /tmp/check_md5.sh
#!/bin/bash
dir=/data/wwwroot/www.abc.com

##注意:这里的特殊字符都需要脱义,比如反引号和$
cd \$dir
n=\`wc -l /tmp/md5.list |awk '{print \$1}'\`
for i in \`seq 1 \$n\`
do
    file_name=\`sed -n "\$i"p /tmp/md5.list |awk '{print \$2}'\`
    md5=\`sed -n "\$i"p /tmp/md5.list |awk '{print \$1}'\`
    if [ -f \$file_name ]
    then
        md5_b=\`md5sum \$file_name |awk '{print \$1}'\`
        if [ \$md5_b != \$md5 ]
        then
            echo "\$file_name changed."
        fi
    else
        echo "\$file_name lose."
    fi
done > /tmp/change.log
EOF

scp /tmp/check_md5.sh $B_ip:/tmp/
ssh $B_ip "/bin/bash /tmp/check_md5.sh"

脚本中,

1)find命令的 -path 选项类似于shell中的正则匹配,-prune -o 组合在一起使用,会把 -prune前面的匹配排除掉

2)要想比较两个文件是否一样,只需要对比它们的md5值即可。md5sum命令可以求出文件的md5值

猜你喜欢

转载自blog.csdn.net/miss1181248983/article/details/86542663
今日推荐