6. 檢測兩臺機器上檔案的差異

最愛喝酸奶發表於2019-01-18

生產環境下,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值

相關文章