![自解压脚本:tar -xO 和 dd](https://linux22.com/image/117135/%E8%87%AA%E8%A7%A3%E5%8E%8B%E8%84%9A%E6%9C%AC%EF%BC%9Atar%20-xO%20%E5%92%8C%20dd.png)
我正在使用一个自解压脚本的脚本。这是一个在 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
.