linux打包固件shell脚本
不打包
pack.sh
解压后无父目录(直接是文件)
生成
checksum.txt
(包含所有文件的 SHA256)打包后
.tar.gz
移动到上级目录
#!/bin/bash# 检查是否传入版本号参数
if [ -z "$1" ]; thenecho "Usage: $0 <version> (e.g. v1.0.1)"exit 1
fiVERSION="$1"
TAR_NAME="dtu_sdk_demo_${VERSION}.tar.gz"
CHECKSUM_FILE="checksum.txt"# 1. 生成 checksum.txt(排除 pack.sh 和自身)
echo "Generating ${CHECKSUM_FILE}..."
find . -type f ! -name "${CHECKSUM_FILE}" ! -name "pack.sh" ! -name "${TAR_NAME}" -exec sha256sum {} + > "${CHECKSUM_FILE}"# 2. 打包当前目录所有文件(排除 pack.sh 和压缩包自身)
echo "Creating ${TAR_NAME}..."
tar -czvf "${TAR_NAME}" \--transform="s|^./||" \--exclude="pack.sh" \--exclude="${TAR_NAME}" .# 3. 将压缩包移动到上级目录
echo "Moving ${TAR_NAME} to parent directory..."
mv "${TAR_NAME}" ../echo "Package created successfully: ../${TAR_NAME}"
关键步骤:
固定排除
pack.sh
直接在
find
和tar
命令中硬编码--exclude="pack.sh"
,避免动态获取脚本名可能带来的问题。
仍然排除
checksum.txt
自身和压缩包确保校验文件不包含自己,且不会重复打包已生成的
.tar.gz
。
--transform="s|^./||"
确保解压后直接是文件,没有父目录层级。
使用方式
chmod +x pack.sh
./pack.sh v1.0.1
适用场景
严格排除
pack.sh
:避免动态获取脚本名可能导致的意外问题。干净打包:解压后直接是文件,适合 SDK/软件发布。
校验文件完整:
checksum.txt
确保文件未被篡改。
如果需要排除更多文件(如 .gitignore
、临时文件等),可在 find
和 tar
命令中添加 --exclude
。
===========================校验方法======================================
静默校验脚本 (verify_checksum.sh
)
#!/bin/bash# 输入参数:升级包目录路径(如 /app/versions/v1.0.1)
UPGRADE_DIR="$1"
CHECKSUM_FILE="${UPGRADE_DIR}/checksum.txt"# 1. 检查目录和校验文件是否存在
if [[ ! -d "${UPGRADE_DIR}" ]]; thenecho "ERROR: Directory ${UPGRADE_DIR} not found."exit 1
fiif [[ ! -f "${CHECKSUM_FILE}" ]]; thenecho "ERROR: checksum.txt not found in ${UPGRADE_DIR}"exit 1
fi# 2. 进入目标目录(校验必须在文件所在目录执行)
cd "${UPGRADE_DIR}" || {echo "ERROR: Cannot enter directory ${UPGRADE_DIR}"exit 1
}# 3. 执行校验(静默模式,仅输出错误)
if ! sha256sum -c "${CHECKSUM_FILE}" > /dev/null 2>&1; thenecho "FAILED: Checksum verification failed. Corrupted or tampered files detected."exit 1
fi# 4. 校验通过
echo "OK: All files verified successfully."
exit 0
脚本特点
无日志文件
所有输出直接打印到终端(或调用方捕获),不写入日志文件。
使用
> /dev/null 2>&1
静默执行sha256sum
,避免冗余输出。
简洁状态码
0:校验成功
1:校验失败(含具体错误分类)
关键错误分类
输出格式 含义 ERROR: <原因>
前置条件检查失败(目录/文件不存在) FAILED: <原因>
校验失败(文件被篡改或损坏) OK: <信息>
校验通过
使用示例
场景 1:直接运行
bash
./verify_checksum.sh /app/versions/v1.0.1
成功输出:
text
OK: All files verified successfully.
失败输出:
text
FAILED: Checksum verification failed. Corrupted or tampered files detected.
场景 2:集成到其他脚本
bash
if ! ./verify_checksum.sh "/app/versions/${NEW_VERSION}"; then# 校验失败时的处理逻辑echo "OTA upgrade aborted."exit 1
fi# 校验通过,继续升级流程
echo "Proceeding with OTA upgrade..."
为什么这样设计?
轻量化
省去日志文件操作,减少 I/O 开销,适合资源受限的设备。
易集成
通过返回值 (
exit code
) 和简短输出即可判断结果,方便被其他脚本调用。
安全性
依然严格校验文件完整性,只是简化了输出方式。
如果需要更详细的调试信息,可以临时移除 > /dev/null 2>&1
,但生产环境建议保持静默。