shell脚本加密发布

129 阅读1分钟

方法一:转换为二进制格式(真正的"编译")

1. shc (Shell Script Compiler)

这是最常用的工具,它并不是真正的编译器,而是将 shell 脚本转换为 C 代码,然后编译成二进制可执行文件。

安装 shc:

bash

# Ubuntu/Debian
sudo apt-get install shc

# CentOS/RHEL/Fedora
sudo yum install shc  # 或 sudo dnf install shc

# macOS
brew install shc

# 或者从源码编译
git clone https://github.com/neurobin/shc
cd shc
./configure
make
sudo make install

使用方法:

bash

# 基本用法
shc -f your_script.sh

# 指定输出文件名
shc -f your_script.sh -o compiled_binary

# 设置过期时间(脚本在指定日期后无法运行)
shc -f your_script.sh -e 31/12/2023

# 更安全的选项(推荐)
shc -f your_script.sh -S -r

生成的文件:

  • your_script.sh.x - 编译后的二进制可执行文件
  • your_script.sh.x.c - 生成的 C 源代码(可以删除)

示例:

bash

# 创建测试脚本
echo '#!/bin/bash
echo "Hello, World! The secret is: $1"' > secret_script.sh
chmod +x secret_script.sh

# 编译
shc -f secret_script.sh -o myapp

# 运行编译后的程序
./myapp "password123"

优点: 真正的二进制文件,反编译困难
缺点: 不是绝对安全,有专门的反编译工具


方法二:打包成自解压归档

2. makeself

将脚本和所有依赖文件打包成一个自解压的安装程序。

安装 makeself:

bash

# Ubuntu/Debian
sudo apt-get install makeself

# 或从官网下载
wget https://megastep.org/makeself/makeself.run
chmod +x makeself.run
./makeself.run

使用方法:

bash

makeself --gzip ./script_dir my_app.run "我的应用" ./main_script.sh

3. 使用 tar 创建自解压脚本

bash

#!/bin/bash
# 创建自解压脚本
ARCHIVE_START=$(awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0")
tail -n+$ARCHIVE_START "$0" | tar -xz -C /tmp
/tmp/extracted_script.sh
exit

__ARCHIVE_BELOW__
# 这里后面接tar压缩的内容

方法三:转换为其他语言的可执行文件

4. bash2c (Bash to C)

将 bash 脚本转换为 C 程序并编译。

bash

# 示例工具使用
#!/bin/bash
# 简单的bash2c转换概念
echo '#include <stdlib.h>
#include <stdio.h>
int main() {' > program.c

# 将echo命令转换为C的printf
echo '    printf("Hello from compiled bash!\n");' >> program.c
echo '    return 0;' >> program.c
echo '}' >> program.c

gcc program.c -o program

5. 使用 Python 工具如 PyInstaller(通过 bash2py)

虽然间接,但可行:

  1. 将 bash 脚本转换为 Python
  2. 用 PyInstaller 打包成二进制

方法四:商业/专业工具

6. Titanium

商业版的 shell 脚本编译器,提供更好的保护和功能。

7. 其他商业解决方案

如 Bat To Exe Converter (Windows) 的类 Unix 版本概念。


方法五:Docker 容器化

虽然不是编译,但可以保护代码:

dockerfile

FROM alpine:latest
COPY your_script.sh /app/
RUN chmod +x /app/your_script.sh
ENTRYPOINT ["/app/your_script.sh"]

然后构建和分发 Docker 镜像:

bash

docker build -t my-app .
docker save my-app > my-app.tar

安全增强建议

无论使用哪种方法,都应该考虑额外的安全措施:

bash

# 1. 使用shc的安全选项
shc -f script.sh -S -r -H -T -v

# 2. 删除调试信息
strip compiled_binary

# 3. 设置文件权限
chmod 700 compiled_binary
chown root:root compiled_binary

# 4. 使用密码保护(高级)
# 可以结合expect或自己实现简单的密码验证

推荐方案

  1. 对于简单保护:使用 shc
  2. 对于分发包含多个文件的应用:使用 makeself
  3. 对于最高安全性要求:考虑用 C/C++/Go 重写核心逻辑
  4. 对于云环境:使用 Docker 容器化

示例完整工作流:

bash

#!/bin/bash
# build.sh - 构建脚本

SCRIPT="my_app.sh"
OUTPUT="my_app_compiled"

echo "编译脚本..."
shc -f $SCRIPT -o $OUTPUT -S -r

echo "去除调试符号..."
strip $OUTPUT

echo "设置权限..."
chmod 700 $OUTPUT

echo "构建完成: $OUTPUT"
echo "文件信息:"
file $OUTPUT
ls -la $OUTPUT

总结: Shell 脚本可以通过多种方式"编译"或封装成可执行文件来保护源代码。shc 是最直接和常用的解决方案,适合大多数场景。但对于极其敏感的逻辑,建议用真正的编译型语言重写。