Shell脚本如何验证云存储数据完整性

wen 实用脚本 1

本文目录导读:

Shell脚本如何验证云存储数据完整性

  1. MD5/SHA256 校验和对比
  2. 文件大小与元数据对比
  3. 分块上传的完整性验证
  4. 自动化完整性监控脚本
  5. 多云平台兼容脚本
  6. 最佳实践建议

在云存储环境中,数据完整性验证是一个关键的安全考量,以下是使用Shell脚本验证云存储数据完整性的几种主流方法:

MD5/SHA256 校验和对比

上传前计算本地校验

#!/bin/bash
# 计算本地文件的校验和
FILE_PATH="/path/to/file.txt"
LOCAL_HASH=$(sha256sum "$FILE_PATH" | awk '{print $1}')
echo "本地文件哈希: $LOCAL_HASH"
# 上传到云存储(以阿里云OSS为例)
ossutil cp "$FILE_PATH" oss://bucket-name/file.txt
# 获取云存储中文件的校验和
REMOTE_HASH=$(ossutil hash oss://bucket-name/file.txt --type sha256 | grep "SHA256" | awk '{print $2}')
echo "云端文件哈希: $REMOTE_HASH"
# 对比校验
if [ "$LOCAL_HASH" == "$REMOTE_HASH" ]; then
    echo "✅ 数据完整性验证通过"
else
    echo "❌ 数据完整性验证失败"
    exit 1
fi

文件大小与元数据对比

#!/bin/bash
verify_file_integrity() {
    local FILE_PATH=$1
    local CLOUD_PATH=$2
    # 获取本地文件信息
    LOCAL_SIZE=$(stat -c%s "$FILE_PATH")
    LOCAL_MOD_TIME=$(stat -c%Y "$FILE_PATH")
    # 获取云端文件信息(以AWS S3为例)
    CLOUD_SIZE=$(aws s3api head-object --bucket my-bucket --key "$CLOUD_PATH" --query 'ContentLength' --output text)
    CLOUD_MOD_TIME=$(aws s3api head-object --bucket my-bucket --key "$CLOUD_PATH" --query 'LastModified' --output text)
    CLOUD_ETAG=$(aws s3api head-object --bucket my-bucket --key "$CLOUD_PATH" --query 'ETag' --output text | tr -d '"')
    # 对比大小
    if [ "$LOCAL_SIZE" -ne "$CLOUD_SIZE" ]; then
        echo "❌ 文件大小不一致: 本地=$LOCAL_SIZE, 云端=$CLOUD_SIZE"
        return 1
    fi
    # 对比ETag
    LOCAL_ETAG=$(md5sum "$FILE_PATH" | awk '{print $1}')
    if [ "$LOCAL_ETAG" != "$CLOUD_ETAG" ]; then
        echo "❌ ETag不匹配"
        return 1
    fi
    echo "✅ 文件完整性验证通过"
    return 0
}
# 使用函数
verify_file_integrity "/local/file.zip" "cloud/path/file.zip"

分块上传的完整性验证

#!/bin/bash
# 适用于大文件的分块验证
verify_large_file() {
    local FILE_PATH=$1
    local CLOUD_PATH=$2
    local CHUNK_SIZE=10485760  # 10MB
    # 获取文件总大小
    FILE_SIZE=$(stat -c%s "$FILE_PATH")
    TOTAL_CHUNKS=$(( (FILE_SIZE + CHUNK_SIZE - 1) / CHUNK_SIZE ))
    echo "文件大小: $FILE_SIZE bytes, 分块数: $TOTAL_CHUNKS"
    # 逐块验证
    for ((i=0; i<TOTAL_CHUNKS; i++)); do
        START_BYTE=$((i * CHUNK_SIZE))
        if [ $((START_BYTE + CHUNK_SIZE)) -gt $FILE_SIZE ]; then
            READ_SIZE=$((FILE_SIZE - START_BYTE))
        else
            READ_SIZE=$CHUNK_SIZE
        fi
        # 计算本地块的校验和
        LOCAL_CHUNK_HASH=$(dd if="$FILE_PATH" bs=1 skip="$START_BYTE" count="$READ_SIZE" 2>/dev/null | sha256sum | awk '{print $1}')
        echo "块 $((i+1)) 本地哈希: $LOCAL_CHUNK_HASH"
        # 这里可以加上云端验证逻辑
        # 实际使用中需要根据云服务商API获取对应块的哈希
    done
    echo "所有分块验证完成"
}
verify_large_file "/path/to/large/file.iso" "cloud/path/file.iso"

自动化完整性监控脚本

#!/bin/bash
# 配置文件
CONFIG_FILE="/etc/cloud_integrity.conf"
LOG_FILE="/var/log/cloud_integrity.log"
# 读取配置
source "$CONFIG_FILE"
# 记录日志
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 验证单个文件完整性
verify_file() {
    local LOCAL_FILE=$1
    local CLOUD_PATH=$2
    local HASH_TYPE=${3:-sha256}
    # 计算本地校验和
    if [ "$HASH_TYPE" == "md5" ]; then
        LOCAL_HASH=$(md5sum "$LOCAL_FILE" | awk '{print $1}')
    else
        LOCAL_HASH=$(sha256sum "$LOCAL_FILE" | awk '{print $1}')
    fi
    # 存储校验和用于后续验证
    echo "$LOCAL_HASH" > "${LOCAL_FILE}.hash"
    # 上传文件(使用rclone)
    rclone copy "$LOCAL_FILE" "cloud:${CLOUD_PATH}" --progress
    if [ $? -eq 0 ]; then
        log "文件上传成功: $LOCAL_FILE -> $CLOUD_PATH"
    else
        log "❌ 文件上传失败: $LOCAL_FILE"
        return 1
    fi
    return 0
}
# 批量验证目录
verify_directory() {
    local LOCAL_DIR=$1
    local CLOUD_DIR=$2
    find "$LOCAL_DIR" -type f | while read -r file; do
        RELATIVE_PATH="${file#$LOCAL_DIR/}"
        CLOUD_PATH="${CLOUD_DIR}/${RELATIVE_PATH}"
        if verify_file "$file" "$CLOUD_PATH"; then
            echo "✓ $RELATIVE_PATH"
        else
            echo "✗ $RELATIVE_PATH"
        fi
    done
}
# 定期校验
schedule_verification() {
    while true; do
        log "开始定期完整性检查..."
        verify_directory "/local/data" "remote-backup"
        log "完整性检查完成"
        sleep 86400  # 每天检查一次
    done
}
# 主程序
case "$1" in
    verify)
        verify_file "$2" "$3"
        ;;
    batch)
        verify_directory "$2" "$3"
        ;;
    schedule)
        schedule_verification
        ;;
    *)
        echo "用法: $0 {verify|batch|schedule} [参数]"
        echo "  verify <本地文件> <云端路径>"
        echo "  batch <本地目录> <云端目录>"
        echo "  schedule        启动定期检查"
        ;;
esac

多云平台兼容脚本

#!/bin/bash
# 云平台选择函数
get_cloud_hash() {
    local PROVIDER=$1
    local CLOUD_PATH=$2
    case "$PROVIDER" in
        aws)
            # AWS S3 ETag
            aws s3api head-object --bucket "${CLOUD_PATH%%/*}" --key "${CLOUD_PATH#*/}" \
                --query 'ETag' --output text | tr -d '"'
            ;;
        gcp)
            # Google Cloud Storage CRC32C
            gsutil hash -h "gs://$CLOUD_PATH" | grep "Hash (crc32c):" | awk '{print $3}'
            ;;
        azure)
            # Azure Blob MD5
            az storage blob show --account-name "${CLOUD_PATH%%/*}" \
                --container-name "${CLOUD_PATH#*/}" \
                --query 'properties.contentSettings.contentMd5' --output tsv
            ;;
        aliyun)
            # 阿里云OSS
            ossutil hash "oss://$CLOUD_PATH" --type sha256 | grep "SHA256" | awk '{print $2}'
            ;;
        *)
            echo "不支持的云平台: $PROVIDER"
            exit 1
            ;;
    esac
}
# 使用示例
verify_multicloud() {
    local PROVIDER=$1
    local LOCAL_FILE=$2
    local CLOUD_PATH=$3
    LOCAL_HASH=$(sha256sum "$LOCAL_FILE" | awk '{print $1}')
    REMOTE_HASH=$(get_cloud_hash "$PROVIDER" "$CLOUD_PATH")
    if [ "$LOCAL_HASH" == "$REMOTE_HASH" ]; then
        echo "✅ [$PROVIDER] 数据完整性验证通过"
        return 0
    else
        echo "❌ [$PROVIDER] 数据完整性验证失败"
        echo "本地: $LOCAL_HASH"
        echo "云端: $REMOTE_HASH"
        return 1
    fi
}
# 使用
verify_multicloud "aws" "/local/file.pdf" "my-bucket/documents/file.pdf"

最佳实践建议

  1. 使用强哈希算法:推荐使用SHA256而非MD5
  2. 存储校验和:在上传时存储校验和到数据库或元数据
  3. 定期验证:设置cron job定期执行完整性检查
  4. 错误处理:添加重试机制和告警通知
  5. 日志记录:详细记录所有验证操作
# 设置cron任务(每天凌晨3点执行)
crontab -e
# 添加:0 3 * * * /path/to/integrity_script.sh schedule
# 示例:重试机制
for i in {1..3}; do
    if verify_file "$FILE" "$CLOUD_PATH"; then
        break
    fi
    echo "第 $i 次重试..."
    sleep 5
done

这些脚本提供了从简单到复杂的完整性验证方案,可根据你的具体需求选择使用。

抱歉,评论功能暂时关闭!