如何给bash脚本进行加密?

2023/04/20 网站 共 2193 字,约 7 分钟

当我们写的bash脚本,有的时候需要分享给别人用,但是又不太想让别人看到实现逻辑。没到这个时候,就想着要是能给这个脚本加密一下就好了。 仅加密脚本的内容,又不影响脚本的运行,多好。要知道在计算机的世界,只有想不到,没有做不到! 你不是第一个遇到这个问题的人,而且有比你更有行动力的人把这个问题解决了。

今天我们就介绍两个工具来解决这个问题。

gzexe

mac系统上自带的一个工具,可以在mac系统上将一个可执行的bash脚本加密。
使用方式:

usage: gzexe [-d] file ...

我们以hello.sh 脚本为例。

#!/bin/bash
echo "Hello World "

操作:

mac % gzexe hello.sh 
gzexe: cannot compress hello.sh, it is not executable # hello.sh 必须是一个可执行文件

# 修改hello.sh 为可执行文件
mac % chmod 744 hello.sh 

mac % gzexe hello.sh 
hello.sh:	   -4.3%  

# 成功,并且体检压缩了4.3% 我们执行一下ls 看看发生了什么
mac % ls
hello.sh	hello.sh~

# 这个时候我们发现hello.sh已经加密了,但我们发现多了一个hello.sh~文件。 这个就是我们的加密前的源文件。
# 源文件还在?我们把hello.sh~删了 , 看看还不能运行。
mac % rm hello.sh~
mac % sh hello.sh 
Hello World # 依然可以运行

但是我们把hello.sh放到其他系统上执行时,会发现失败。但是在mac本地系统执行时,还是可以的.

shc (Shell Script Compiler)

shell(bash) 脚本编译指令。mac系统原生不支持,可以通过下面方式安装。

安装步骤

  1. 检查本地是否装有shc, 直接输入shc命令
  2. 安装
# linux 
yum install shc

# mac
brew install shc

使用

使用方式:

mac % shc -h
shc Version 4.0.3, Generic Shell Script Compiler
shc GNU GPL Version 3 Md Jahidul Hamid <jahidulhamid@yahoo.com>
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f script

    -e %s  Expiration date in dd/mm/yyyy format [none]
    -m %s  Message to display upon expiration ["Please contact your provider"]
    -f %s  File name of the script to compile
    -i %s  Inline option for the shell interpreter i.e: -e
    -x %s  eXec command, as a printf format i.e: exec('%s',@ARGV);
    -l %s  Last shell option i.e: --
    -o %s  output filename
    -r     Relax security. Make a redistributable binary
    -v     Verbose compilation
    -S     Switch ON setuid for root callable programs [OFF]
    -D     Switch ON debug exec calls [OFF]
    -U     Make binary untraceable [no]
    -H     Hardening : extra security protection [no]
           Require bourne shell (sh) and parameters are not supported
    -C     Display license and exit
    -A     Display abstract and exit
    -B     Compile for busybox
    -h     Display help and exit

同样以hello.sh脚本为例

# 普通加密
mac % shc -v -f hello.sh
mac % ls 
hello.sh # 原始脚本	
hello.sh.x	# 可执行脚本
hello.sh.x.c # 可执行脚本c语音文件

# 设置过期时间的加密脚本
mac % shc -v -e 20/04/2023 -m "过期了" -f hello.sh -o hello_expir.sh 
shc -e Thu Apr 20 00:00:00 2023
shc -e Thu Apr 20 00:00:00 2023
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc   hello.sh.x.c -o hello_expir.sh
shc: strip hello_expir.sh
shc: chmod ug=rwx,o=rx hello_expir.sh

# 查看结果
mac % ls 
hello.sh	hello.sh.x.c	hello_expir.sh

# 过期效果
mac % ./hello_expir.sh 
./hello_expir.sh: has expired!
过期了

同gzexe一样,加密后的脚本一样不支持跨平台运行,即使是编译成c语言的二进制脚本。因为可执行文件会依赖不同系统的动态链接库。

参考

gzexe 源码

gzexe examples

SHC-Shell-Compiler

shc官网

文档信息

Search

    Table of Contents