使用SHA256校验并安全执行远程脚本

推荐方案:下载后校验SHA256再执行(最安全)

#!/bin/bash

SCRIPT_URL="https://example.com/script.sh"
EXPECTED_SHA256="aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f"  # 替换为实际值

# 创建临时文件
TEMP_SCRIPT=$(mktemp) || { echo "创建临时文件失败"; exit 1; }

# 下载脚本
echo "正在下载脚本..."
curl -fsSL "$SCRIPT_URL" -o "$TEMP_SCRIPT" || {
    echo "下载失败"
    rm -f "$TEMP_SCRIPT"
    exit 1
}

# 计算SHA256校验和
echo "正在校验脚本完整性..."
ACTUAL_SHA256=$(sha256sum "$TEMP_SCRIPT" | awk '{print $1}')

# 校验
if [ "$EXPECTED_SHA256" != "$ACTUAL_SHA256" ]; then
    echo "SHA256校验失败!"
    echo "预期: $EXPECTED_SHA256"
    echo "实际: $ACTUAL_SHA256"
    rm -f "$TEMP_SCRIPT"
    exit 1
fi

# 执行脚本
echo "校验成功,执行脚本..."
chmod +x "$TEMP_SCRIPT"
"$TEMP_SCRIPT"
EXIT_CODE=$?

# 清理
rm -f "$TEMP_SCRIPT"
exit $EXIT_CODE

管道方式校验SHA256并执行(仅限简单脚本)

#!/bin/bash

SCRIPT_URL="https://example.com/script.sh"
EXPECTED_SHA256="aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f"

# 下载、校验并执行
curl -fsSL "$SCRIPT_URL" | {
    # 计算SHA256并校验
    SHA_CHECK=$(tee >(sha256sum | awk '{print $1}') | {
        read ACTUAL_SHA
        if [ "$EXPECTED_SHA256" = "$ACTUAL_SHA" ]; then
            echo "SHA256校验成功,执行脚本..."
            bash  # 执行脚本内容
        else
            echo "SHA256校验失败!预期: $EXPECTED_SHA256,实际: $ACTUAL_SHA" >&2
            exit 1
        fi
    })
}

增强版:带HTTPS证书验证和超时设置

#!/bin/bash

SCRIPT_URL="https://example.com/script.sh"
EXPECTED_SHA256="aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f"
TIMEOUT=10  # 超时时间(秒)

# 安全下载
TEMP_SCRIPT=$(mktemp) || exit 1
if ! curl --fail --silent --show-error --max-time $TIMEOUT \
    --location "$SCRIPT_URL" --output "$TEMP_SCRIPT"; then
    echo "下载失败或超时"
    rm -f "$TEMP_SCRIPT"
    exit 1
fi

# 校验
ACTUAL_SHA256=$(sha256sum "$TEMP_SCRIPT" | awk '{print $1}')
if [ "$EXPECTED_SHA256" != "$ACTUAL_SHA256" ]; then
    echo "安全校验失败: 文件可能被篡改"
    echo "预期SHA256: $EXPECTED_SHA256"
    echo "实际SHA256: $ACTUAL_SHA256"
    rm -f "$TEMP_SCRIPT"
    exit 1
fi

# 安全执行
chmod +x "$TEMP_SCRIPT"
"$TEMP_SCRIPT"
EXIT_CODE=$?
rm -f "$TEMP_SCRIPT"
exit $EXIT_CODE

使用说明

  1. 获取正确的SHA256值

    sha256sum your_script.sh | awk '{print $1}'
  2. 安全建议

    • 始终使用HTTPS协议
    • 重要脚本建议使用GPG签名验证
    • 生产环境推荐使用”下载后校验”方案
    • 设置合理的curl超时时间
  3. 调试模式
    在脚本开头添加 set -x 可以显示执行过程

  4. 日志记录
    可以将重要输出重定向到日志文件:

    exec > >(tee -a /var/log/script_runner.log) 2>&1

选择哪种方案取决于您的安全需求,对于关键系统,建议使用最安全的临时文件方案。

文档更新时间: 2025-07-11 01:02   作者:月影鹏鹏
IT运维支持-AIWALY-月影工作室