使用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
使用说明
获取正确的SHA256值:
sha256sum your_script.sh | awk '{print $1}'安全建议:
- 始终使用HTTPS协议
- 重要脚本建议使用GPG签名验证
- 生产环境推荐使用”下载后校验”方案
- 设置合理的curl超时时间
调试模式:
在脚本开头添加set -x可以显示执行过程日志记录:
可以将重要输出重定向到日志文件:exec > >(tee -a /var/log/script_runner.log) 2>&1
选择哪种方案取决于您的安全需求,对于关键系统,建议使用最安全的临时文件方案。
文档更新时间: 2025-07-11 01:02 作者:月影鹏鹏