Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux二进制安装程序(.bin、.sh)是如何工作的?_Linux_Installation - Fatal编程技术网

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

Linux二进制安装程序(.bin、.sh)是如何工作的?,linux,installation,Linux,Installation,一些软件(例如)以.sh文件的形式提供Linux安装程序。我很好奇他们是如何将整个IDE“打包”成一个“shell脚本”的,我在一个编辑器中打开了这个文件。我看到一些纯文本shell脚本代码,然后是一些随机乱码,我认为是“二进制”或非纯文本 我想知道他们是如何混合普通的shell脚本,然后可能会调用“不可读”的东西,即二进制文件 对此有什么见解吗 基本上,它是一个shell脚本,预先添加到某种压缩归档文件中,例如tar归档文件。您可以在自己身上使用tail或sed命令(Bourne shell中

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

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


对此有什么见解吗

基本上,它是一个shell脚本,预先添加到某种压缩归档文件中,例如tar归档文件。您可以在自己身上使用
tail
sed
命令(Bourne shell中的
$0
变量)去掉前面的shell脚本,并将其余脚本传递给您的unarchiver

例如,将以下脚本创建为自解压脚本:

#!/bin/sh -e
sed -e '1,/^exit$/d' "$0" | tar xzf - && ./project/Setup
exit
上面的
sed
命令删除从文件第一行到以“exit”开头的第一行的所有行,然后将其余的行传递给其他行。如果在“exit”行之后立即开始的是tar文件,则
tar
命令将提取该文件。如果成功,将执行
/project/Setup
文件(可能是从tarball中提取的)

然后:


现在,如果您摆脱旧的
项目
目录,您可以运行
自解压
,它将解压tar文件并运行安装脚本。

您可能想签出

根据作者的笔记

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

Makeself归档还包括完整性自验证校验和(CRC和/或MD5校验和)

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

我试图使这个脚本的代码尽可能可移植,也就是说,它不依赖任何特定于bash的特性,只调用安装在任何运行的UNIX兼容系统上的命令。这个脚本以及它生成的归档文件应该在任何Unix版本上运行,并带有任何兼容的Bourne shell,当然前提是压缩程序可用

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

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


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

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

Netbeans有自己的安装引擎,其中一部分用于解包和启动,在NBI本机启动器组件中完成:


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

在许多实际情况下,shell脚本如何与归档内容交互?(可能是其他语言-汇编/二进制/字节码),二进制部分将进行base64编码或其他类似的编码,以便整个文件只包含可打印字符。Amit:一旦提取了存档文件,它就是磁盘上的文件,您可以对磁盘上的文件执行任何shell脚本可以执行的操作。我的示例运行一个从存档中提取的安装脚本。非常感谢,这是一个非常好且简单的解释。
sed
无法正确处理Darwin,因为它在提取的文件末尾附加了一个\n。在Mac电脑上使用grep/cut/tail(参见@seb的答案)。我选择Curt的答案是因为他解释了这个过程,而不是指向一个工具。谢谢Seb、James和Nik。酷,Ubuntu存储库中甚至还有一个包!sudo-apt-get-install-makeself
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