Linux二进制安装程序(.bin,.sh)如何工作?

某些软件(例如, NetBeans IDE )以.sh文件forms提供Linux安装程序。 对于如何将整个IDE“打包”成“shell脚本”感到好奇,我在一个编辑器中打开了这个文件。 我看到一些纯文本shell脚本代码,然后是一些随意的乱码,我认为它是“二进制”或非纯文本。

我想知道他们如何混合纯shell脚本,然后可能会调用“不可读”的东西,这将是二进制文件。

有关于此的任何见解?

基本上,这是一个前置于某种压缩存档的shell脚本,比如一个tar归档文件。 对自己使用tailsed命令(Bourne shell中的$0variables)可以去掉前面的shell脚本,并将其余部分传递给你的unarchiver。

例如,创build以下脚本作为self-extracting

 #!/bin/sh -e sed -e '1,/^exit$/d' "$0" | tar xzf - && ./project/Setup exit 

然后:

 mkdir project echo "#!/bin/sh" > project/Setup echo "echo This is the setup script!" >> project/Setup chmod +x project/Setup tar czf - project >> self-extracting 

现在,如果摆脱旧的project目录,则可以运行self-extracting ,然后解压该tar文件并运行安装脚本。

你可能想看看makeself.sh

从作者的笔记。

makeself.sh是一个小型的shell脚本,可以从一个目录中生成一个可自解压的 tar.gz压缩文件。 生成的文件显示为一个shell脚本(其中许多具有.run后缀),并且可以按原样启动。 然后归档文件将解压到一个临时目录,并执行一个可选的任意命令(例如安装脚本)。

自己存档还包括完整性自我validation校验和(CRC和/或MD5校验和)。

makeself.sh脚本本身仅用于从文件目录创build档案。 生成的压缩文件实际上是一个压缩(使用gzip,bzip2或compress)TAR压缩文件,在开头处有一个小的shell脚本存根。 这个小存根执行所有提取文件的步骤,运行embedded式命令,并在全部结束时删除临时文件。 用户所需要做的就是安装包含在这个档案中的软件,以便“运行”档案[即执行脚本]

我试图保持这个脚本的代码尽可能便携,也就是说,它不依赖任何bash特有的function,只调用安装在任何正常运行的UNIX兼容系统上的命令。 这个脚本以及它生成的档案应该在任何Unix版本上运行,并且提供任何兼容的Bourne shell,当然提供了压缩程序。

最后, makeself包本身就是一个名为makeself.run的自解压脚本。

将二进制负载添加到您的Shell脚本

GNU sharutils:

http://www.gnu.org/software/sharutils/

是一个用于创buildshell归档的工具集,并提供了一些可能有用的附加function(如校验和以确保有效负载在传输中不受损坏)。

当最终产品必须被shell解释时,防止恶意修改并不是真的可行 – 任何了解生成技术的人都可以修改校验和。

还有其他/商业软件安装程序生成器(如InstallAnywhere),他们基本上有自己的版本的Shar / makeself。

Netbeans有它自己的安装程序引擎,它的一部分,在NBI本地启动程序组件中完成解包和启动: http : //wiki.netbeans.org/NBINativeLaunchers

为Linux / Unix / MacOS创buildshell(脚本)归档文件,以及为Windows创build本机可执行文件。 您也可以将该工具用于您自己的项目。