问题很简单;是否可以将bash脚本转换为可执行文件?如果是的话,怎么办呢?
答案 0 :(得分:9)
这是可能的,但你不想这样做。
在支持将脚本编译为独立可执行文件的地方,可以通过将解释器的副本放入可执行文件来完成。因此,这比单独的脚本大得多。
遗憾的是,bash使用的执行模型本身很慢:几乎所有功能都是由外部命令提供的;和简单命令的参数,甚至它们的名称,都可以通过扩展操作的结果进行修改。这种动态性使得无法有效地编译性能。 (zsh支持预编译过程,但好处有限,主要是解析自身的过程。)
以shc
为例:它将脚本的原始源作为命令行参数传递。因此,只需从/proc
中读取命令行参数或使用strace
即可读取该源。
正如他们所说,“默默无闻的安全根本就没有安全性” - 任何能够合理胜任的人都可以通过这种方式轻率提取任何密码或其他内容。
答案 1 :(得分:1)
您可以使用shc(如Flavius Anton所述)。
但是你需要知道这个二进制文件不是全部独立的。它仍然依赖于shell,即如果代码是专门为Bash编写的,然后使用shc进行转换,则在系统上没有安装Bash的情况下它将无法运行。
23bytes
脚本的test
变成了9.6KB
二进制文件。_SC_ARG_MAX
系统配置参数的限制。<小时/>
bash2py将Bash源代码转换为python源代码。然后,您可以使用cx_freeze之类的工具将Python源转换为二进制文件,该文件将在没有bash的情况下独立运行。不要太兴奋,你会发现这对实际工作毫无用处,至少现在是这样(bash2py<=3.2
)。
#!/bin/bash
echo works
bash2pyengine ./test
cxfreeze ./test.py
dist
目录)。您可以在那里找到二进制文件(名为test
)。从该目录运行它。请注意,共享对象文件是此二进制文件的依赖项。只要您使用它获取所有共享对象文件,就可以移植此二进制文件。test
脚本,原始尺寸为23bytes
,test.py -> 38bytes
,test (binary) -> 1.3MB
和总(binary and it's dependencies) -> 6.5MB!!!
Array
是橙色(现在),这意味着“不一定得到很好的支持”,实际上它根本不受支持(但bash2py<=3.2
)。因此,即使是Bash to Python转换也没有很好地执行,你必须考虑下一步的限制(冻结)。以上两者都不是真正的解决方案。要明确的是,Bash2py
比shc
更糟糕,因为它不支持所有Bash功能(还有bash2py<=3.2
),即您无法自由编写代码并期望它可以与Bash2py。
经过所有这些乏味的努力,我不禁同意@Charles Duffy:
这是可能的,但你不想这样做。
答案 2 :(得分:0)
是的,有。这是一个名为“shc”的小项目( Sh ell C ompiler)。您可以在Github repo
上找到更多信息我知道我大约2年前使用它并且工作正常。