如何编译一个Linux shell脚本成为一个独立的可执行文件*二进制*(即不只是如chmod 755)?
我正在寻找一个免费的开源工具集,它将编译各种“经典”脚本语言,例如Korn Shell,ksh,csh,bash等作为可执行文件 – 如果脚本调用其他程序或可执行文件,被包含在单个可执行文件中。
原因:
-
为了混淆交付给客户的代码,以便不泄露我们的知识产权 – 将其交付给客户自己的机器/系统,我无法控制访问权限,因此程序文件必须是二进制的通过在文本编辑器或
hexdump
查看器中查看工作是不容易看到的。 -
为客户制作一个简单的部署程序,而不需要/或者最less量的任何外部依赖。
我喜欢简单的东西,而不需要包pipe理器,因为:
-
我不能依靠客户的知识去执行(不)包装说明和
-
我不能依赖关于安装软件包(实际上来自第三方)的机器策略。
最简单的首选方法是能够编译到适当的机器代码一个单一的可执行文件,将无需任何依赖的情况下运行。
完全满足我的需求的解决scheme将是SHC – 一个免费的工具,或CCsh一个商业工具。 既将shell脚本编译为C,然后可以使用C编译器进行编译。
有关SHC的链接:
- https://github.com/neurobin/shc
- http://www.datsi.fi.upm.es/~frosal/
- http://www.downloadplex.com/Linux/System-Utilities/Shell-Tools/Download-shc_70414.html
有关CCsh的链接:
你可以使用这个: http : //megastep.org/makeself/
这会生成一个shell脚本,它可以将捆绑的tar.gz压缩文件自动解压到临时目录中,然后在提取时运行任意命令。
使用这个工具,你只能给客户端提供一个shell脚本。
然后这个脚本将你的ofbsh混淆脚本和二进制文件解压到/ tmp中,并透明地运行它们。
你可以用类似ofbsh的东西混淆shell脚本。 不过,您不会轻易将其他程序捆绑到unix的单个可执行文件中。 通常,安装的方法是为平台的软件包pipe理器(例如rpm, deb, pkg )提供一个软件包,或者提供一个tarball来解开相应的目录。
如果你需要一个解压内容的可执行文件,你可以使用一个shell归档。 看看shar(1)的文档,看看是否会得到你想要的
如果你真的需要一个脚本function将多个C程序粘合在一起,请看看Tcl语言。 它有一个API,旨在简单地包装C程序,期望看到argv[]
样式参数。 您甚至可以将C代码块embedded到自定义的Tcl解释器中,并将其与各种Tcl脚本粘合在一起。
如果你真的需要使它不透明的话,你可以encryptiontcl脚本,并把所有东西包装在一个不encryptiontcl脚本的缓冲区中,然后运行Tcl解释器。 Tcl可以接受来自文件或char*
缓冲区的脚本,所以未encryption的脚本永远不必打到文件系统。
SHC
我已经修改了原始源代码,并升级到一个新版本,并增加了一些function和错误修复。 就在这里
用法示例:
shc -f script.sh -o binary_name
script.sh将被编译为一个名为binary_name的二进制文件
请注意,您仍然需要在您的系统中安装所需的shell来运行此可执行文件。
arx是一款出色的打包程序,您可以在其工作stream程中集成混淆器。
您可以使用的选项:
-
在你的代码中写一个逻辑,当代码第一次在一个盒子上运行时,它将检查是否存在所有需要的包。 如果他们不这样做,代码会自动获取包,并将安装它们…而不要求用户做任何事情。 (Y / N)“,用户需要询问的唯一问题是”是否可以继续安装上述软件包? 除此之外的任何东西都太多了。
-
一旦上面的代码完成(是的,我知道它可能不是那么简单,你可以编码,或者可能是,我不知道你的编码能力),复制并粘贴你完成的代码到一个像kinglazy.com这样的网站,并为您生成一个实际的可执行文件。
这个特殊选项有很多好处:
- 是的,您将能够运行脚本的encryption版本而不会暴露任何专有信息。
- 没有人可以试图“看”你的剧本,因为如果他们这样做,他们什么也看不到,但是不会encryption的,encryption的术语对他们是没有意义的。
- 没有人可以尝试修改你的脚本,因为如果他们这样做,脚本将立即变得无法操作。
- 没有人可以在脚本上运行debugging器来查看它的工作原理。 如果他们这样做,脚本将中止。
- 而且,没有人可以在同一台服务器上创build脚本的副本。 如果他们这样做,它会中止,将无法正常工作。 它只允许用户创build符号链接到脚本的任何位置的原始位置。
我可能会错过你所要求的一些东西,但是我相信上述内容能满足你想要的东西。
不知道这是否适用于其他脚本,但它确实适用于shell脚本。
您也可以使用免费的在线版CCsh将shell脚本编译为二进制文件: http : //www.comeaucomputing.com/tryccsh/