自解压脚本:tar -xO 和 dd

自解压脚本:tar -xO 和 dd

我正在使用一个自解压脚本的脚本。这是一个在 QNAP NAS 上安装软件包的脚本。

它在开始时有一些脚本可以提取文件的其余部分。事情是这样的:

script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv

这用于dd将字节从字节 102 开始复制到 tar 中,并在其中提取。

有什么-xO作用?为什么它被提取“两次”(两次调用 tar -x)? 我在网上找不到太多关于此问题的讨论 - 手册页似乎表明它与“驱动器”有关。(看起来我把 0 和 Os 搞混了!)

随后,脚本执行以下操作:

offset=$(/usr/bin/expr $script_len + 2042)
/bin/dd if="${0}" bs=$offset skip=1 | /bin/cat | /bin/dd bs=1024 count=7 of=$_EXTRACT_DIR/data.tar.gz

这似乎会进一步跳到文件中,并将其中的字节复制到新的压缩 TAR 中。据推测,这些字节已经以这种方式结构化和编码。

但是我们不是已经在第一个命令中通过 tar 读取了这些字节吗?我看不出有什么方法dd被告知停止阅读该文件。

答案1

我们来看看 QNAP 的封装,例如http://www.twonkyforum.com/downloads/8.3/TwonkyServerEU_8.3_arm-x41.qpkg

....
script_len=2467
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv -C $_EXTRACT_DIR script_len=2467
....

现在让我们用 复制数据dd,看看里面有什么:

%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first

这是一个原始的 TAR 存档,里面有一个 tar.gz 文件:

%file first 
first: POSIX tar archive (GNU)

%tar -tvf first 
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz

下一个管道步骤是/bin/tar -xO,这是 TAR手动的上面说:

要将提取的文件写入标准输出,而不是在文件系统上创建文件,请--to-stdout' (结合使用 -O') 和--extract' (--get', `-x')。

如果您要提取文件以通过管道发送它们,并且不需要将它们保留在文件系统中,则此选项非常有用。如果您提取多个成员,他们出现在标准输出连接上,按照它们在档案中找到的顺序。

由于存档内只有一个文件control.tar.gz,因此它将被提取到 STDOUT,由下一个管道步骤处理,该步骤将再次调用 TAR 以从中提取内部内容。

因此,基本上,“tar”存档内有一个“tar.gz”存档,这就是为什么tar需要两个连续命令来提取它的原因。

请注意,它tar本质上是设计用于对流数据进行操作的,因此它可以可靠地检测存档的结尾,即使后面有更多数据:

从物理上讲,存档由一系列文件条目组成,并以存档结束条目结尾,该条目由两个 512 个零字节块组成。

因此,tar -xO, 将在读取第一个数据文件后停止,并丢弃其余部分,我想这是在qpkg.

相关内容