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

62 linux installer

某些软件(例如NetBeans IDE)将Linux安装程序发布到.sh文件中.想知道他们如何将整个IDE打包成'shell脚本',我在编辑器中打开了文件.我看到一些纯文本shell脚本代码,然后是一些随机的乱码,我认为它是"二进制"或非纯文本.

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

对此有何见解?

Cur*_*son 86

基本上,它是一个shell脚本,前面是某种压缩存档,例如tar存档.您自己使用tailor sed命令($0Bourne shell中的变量)来剥离前面的shell脚本并将其余部分传递给unarchiver.

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

#!/bin/sh -e
sed -e '1,/^exit$/d' "$0" | tar xzf - && ./project/Setup
exit
Run Code Online (Sandbox Code Playgroud)

sed上面的命令删除文件第一行中的所有行到以"exit"开头的第一行,然后通过其余行.如果在"exit"行之后立即启动的是tar文件,则该tar命令将提取它.如果成功,将执行./project/Setup文件(可能从tarball中提取).

然后:

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
Run Code Online (Sandbox Code Playgroud)

现在,如果你摆脱旧的project目录,你可以运行self-extracting它,它将提取该tar文件并运行安装脚本.

  • Amit:一旦你解压缩了存档,它只是磁盘上的文件,你可以做任何shell脚本可以对磁盘上的文件做的事情.我的示例运行从存档中提取的安装脚本. (2认同)
  • `sed` 在 Darwin 上无法正常工作,因为它在提取的文件末尾附加了 \n。在 Mac 上使用 grep/cut/tail (参见 @seb 的回答)。 (2认同)

nik*_*nik 52

你可能想看看 makeself.sh

从作者的笔记.

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

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

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

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

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


Jam*_*s F 5

GNU sharutils:

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

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

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