【问题标题】:How do Linux binary installers (.bin, .sh) work?Linux 二进制安装程序(.bin、.sh)如何工作?
【发布时间】:2010-10-31 15:00:54
【问题描述】:

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

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

对此有何见解?

【问题讨论】:

  • 我选择 Curt 的答案是因为他解释了这个过程,而不是指向一个工具来完成它。谢谢 Seb、James 和 Nik。

标签: linux installation


【解决方案1】:

基本上,它是一个预先添加到某种压缩存档(例如 tar 存档)的 shell 脚本。您对自己使用 tailsed 命令(Bourne shell 中的 $0 变量)剥离前面的 shell 脚本并将其余部分传递给您的解压缩器。

例如,将以下脚本创建为self-extracting

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

上面的sed 命令删除从文件第一行到第一行以“exit”开头的所有行,然后传递其余行。如果在“exit”行之后立即开始的是一个 tar 文件,tar 命令将解压它。如果成功,./project/Setup 文件(可能是从压缩包中提取)将被执行。

然后:

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 文件并运行安装脚本。

【讨论】:

  • shell 脚本如何与存档内容交互?(可能是其他一些语言-汇编/二进制/字节码)
  • 在许多实际情况下,二进制部分将采用 base64 编码或其他某种编码,以便整个文件只包含可打印的字符。
  • 阿米特:一旦你解压了存档,它就只是磁盘上的文件,你可以做任何shell脚本可以对磁盘上的文件做的任何事情。我的示例运行从存档中提取的安装脚本。
  • 是的,Curt。非常感谢,这是一个非常好的和简单的解释。
  • sed 在 Darwin 上无法正常工作,因为它在提取文件的末尾附加了一个 \n。在 Mac 上使用 grep/cut/tail(参见@seb 的回答)。
【解决方案2】:

您可能想查看makeself.sh

来自作者的笔记。

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

Makeself 存档还包括用于完整性自我验证的校验和(CRC 和/或 MD5 校验和)。

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

我试图让这个脚本的代码尽可能地可移植,即它不依赖于任何特定于 bash 的功能,并且只调用安装在任何正常运行的 UNIX 兼容系统上的命令。这个脚本以及它生成的档案应该可以在任何 Unix 风格上运行,使用任何兼容的 Bourne shell,当然前提是压缩程序可用。

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

【讨论】:

  • 酷,Ubuntu 存储库中甚至还有一个包! sudo apt-get install makeself
【解决方案3】:
【解决方案4】:

GNU sharutils:

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

是一个用于创建 shell 存档的工具集,并提供了一些可能有用的附加功能(例如确保负载在传输过程中不被损坏的校验和)。

当最终产品必须由 shell 解释时,防止恶意修改实际上并不可行 - 任何了解生成技术的人也可以修改校验和。

【讨论】:

    【解决方案5】:

    还有其他/商业软件安装程序构建器(例如 InstallAnywhere),它们基本上都有自己的 shar/makeself 版本。

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

    为 Linux/Unix/MacOS 创建一个 shell(脚本)存档,为 Windows 创建一个本机可执行文件。您也可以将该工具用于您自己的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2018-09-03
      • 1970-01-01
      • 2016-12-17
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多