Linux下打包程序生成自解压自运行文件


#!/usr/bin/env bash
# Program:
#   打包程序生成自解压自运行文件
# History:
#   2020/03/25  [KibaAmor](https://kibazen.cn)    Create this file

# 遇到错误时退出
set -e

# 配置
#################################################################
# 打包后可执行文件的名字
PACKAGE_NAME="server.run"
# 需要被打包程序的目录名(不要包含路径)
TARGET_DIR=server
# 被打包程序的可执行程序
EXEC_NAME="run.sh"


# 开始生成自解压的可执行程序
#################################################################
# 创建自解压脚本
cat > ${PACKAGE_NAME} << 'END'
#!/usr/bin/env bash
# Program:
#   打包目录'TARGET_DIR'生成自解压自运行的可执行文件
# History:
#   CURRENT_DATETIME  [KibaAmor](https://kibazen.cn)    Create this file

# 遇到错误时退出
set -e

# 解压目录必须不存在
test -e TARGET_DIR && echo "'TARGET_DIR' already exist. Remove?" &&  rm -Ir TARGET_DIR
test -e TARGET_DIR && echo "'TARGET_DIR' is still exist. please remove manual" && exit -1

# 生成一个空的,用于解压文件的目录
mkdir TARGET_DIR

# 定位程序压缩后二进制数据在脚本中的位置
BIN_LINE_NUM=$(awk '/^__LAST_LINE__/ { print NR+1; exit 0; }' $0)
# 解压被打包的程序
tail -n +${BIN_LINE_NUM} $0 | tar -xz -C TARGET_DIR --strip-components=1

# 进入目录
cd TARGET_DIR
# 赋予可执行权限
chmod +x ./EXEC_NAME
# 开始执行被打包的程序
./EXEC_NAME $*

# 正常退出
exit 0

__LAST_LINE__
END

CURRENT_DATETIME=$(date +'%Y/%m/%d %H:%M:%S')
# 替换自解压脚本中的变量
sed -i "s/TARGET_DIR/${TARGET_DIR}/g" ${PACKAGE_NAME}
sed -i "s/EXEC_NAME/${EXEC_NAME}/g" ${PACKAGE_NAME}
sed -i "s@CURRENT_DATETIME@$(date +'%Y/%m/%d %H:%M:%S')@g" ${PACKAGE_NAME}

# 将打包的程序压缩,并将压缩后的二进制数据附加到自解压脚本后面
tar c ${TARGET_DIR} | gzip -f >> ${PACKAGE_NAME}

# 给自解压脚本执行权限
chmod +x ${PACKAGE_NAME}

# 输出信息
echo "打包成功. 打包后的文件为:${PACKAGE_NAME}"

# 正常退出
exit 0

文章作者: Kiba Amor
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 Kiba Amor !
  目录