当我们写的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系统原生不支持,可以通过下面方式安装。
安装步骤
- 检查本地是否装有shc, 直接输入shc命令
- 安装
# 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语言的二进制脚本。因为可执行文件会依赖不同系统的动态链接库。
参考
文档信息
- 本文作者:寒澈
- 本文链接:https://www.hancher.top/2023/04/20/bash_shc/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)