shell批量对比不同host的目录文件

本文介绍了一种通过Shell脚本快速检测数据集群中各节点文件一致性的方法。该方法适用于如FastDFS等需要保证副本间文件一致性的场景,通过批量扫描、排序节点上的文件,并进行比对来确保数据同步正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设有一个数据集群, 它的每个节点的目录/data/下面有很多子目录, 子目录内包含很多文件;
每两个节点的/data/目录下所有文件理论上要保持一致(比如fastdfs的两副本模式)。

现在需要快速的对每两台机器上的/data目录下的文件检测是否全部一致, 那么可以怎么做呢?
一个思路是利用shell实现, 每次将两台机器上的文件全部扫描并排序到一个文件内, 然后拉取到本地上进行对比。

具体示例代码(同时解决了sudo密码验证的问题)如下:

#!/bin/bash

# 每行两个要用于对比文件的ip
ipPairs=(
192.168.1.59 192.168.1.60
192.168.1.81 192.168.1.86
192.168.1.82 192.168.1.87
)
# ssh用户/ssh端口/sudo密码
username="yourname"
port="yourport"
sudoPasswd="yourpassword"

# 检查列表长度是否为偶数
if [[ ${#ipPairs[@]}%2 -eq 1 ]];
then
    echo "invalid pair in ipPairs."
    exit
fi

for((i=0;i<${#ipPairs[@]};i+=2))
do
    ipOne=${ipPairs[$i]}
    ipTwo=${ipPairs[$i+1]}
    echo "ip1:" $ipOne "ip2:" $ipTwo

/usr/bin/expect <<-EOF
    set timeout 300
    spawn ssh -t -p $port -l ${username} $ipOne {sudo find /data/ -type f | sort > /tmp/${ipOne}.log}
    expect {
        "(yes/no)? " { send "yes\n" }
        "password for ${username}: " { send "${sudoPasswd}\n" }
    }

    spawn ssh -t -p $port -l ${username} $ipTwo {sudo find /data/ -type f | sort > /tmp/${ipTwo}.log}
    expect {
        "(yes/no)? " { send "yes\n" }
        "password for ${username}: " { send "${sudoPasswd}\n" }
    }
interact
expect eof
EOF

    scp -P $port ${username}@$ipOne:/tmp/${ipOne}.log ${ipOne}.log
    if [ `ls -l ${ipOne}.log | awk '{ print $5 }'` -lt  1 ]
    then
        echo "${ipOne}.log is empty."
    fi

    scp -P $port ${username}@$ipTwo:/tmp/${ipTwo}.log ${ipTwo}.log
    if [ `ls -l ${ipTwo}.log | awk '{ print $5 }'` -lt  1 ]
    then
        echo "${ipTwo}.log is empty."
    fi

    # 对比sha1
    sha1sum ${ipOne}.log ${ipTwo}.log

    # 查找差集
    comm -1 -3 ${ipOne}.log ${ipTwo}.log > ${ipTwo}_${ipOne}.log
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值