为什么 Debian 8.5 和 8.7 中的 tar czf 存在差异?

为什么 Debian 8.5 和 8.7 中的 tar czf 存在差异?

该代码在 Debian 8.5 中有效,但在 Debian 8.7 中无效

 root@masi:/home/masi# nice tar --keep-directory-symlink czf /media/masi/masiDisc/backup_home_27.2.2017.tar.gz /home/masi/

在 Debian 8.7 中,我使用 GNU tar 1.27.1

tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
Try 'tar --help' or 'tar --usage' for more information.

我可以通过附加来修复它,-czf不确定是否等效

 root@masi:/home/masi# nice tar --keep-directory-symlink -czf /media/masi/masiDisc/backup_home_27.2.2017.tar.gz /home/masi/

操作系统:Debian 8.7

答案1

我真的开始想知道,我无法重现您声称在 BusyBox tarstar、中看到的行为libarchive-bsdtar


(之前的帖子)问题是,您使用的是哪个 tar? 8.5/8.7 中的 GNU tar 几乎相同,并且它们都会导致您看到的相同错误。不会导致它的原因可能是通过 Debian 替代品 / 使用其他一些 tar dpkg-divert,或者碰巧在您路径上的其他地方。

这些是每个版本附带的 GNU tar 版本,如 Debian FTP 上的 ISO 列表所示:

debian-8.5.0-amd64-CD-1.list.gz:tar_1.27.1-2+b1_amd64.deb
debian-8.7.0-amd64-CD-1.list.gz:tar_1.27.1-2+deb8u1_amd64.deb

它们极其相似,仅包含一个 CVE-2016-6321 补丁。你可以在这里看到 Debian 如何处理它:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=842339 该补丁处理 tarball 中路径条目的处理/../,并且不影响参数的处理。

如果我们获得两个 deb(在我的例子中,我从 netinst iso 中提取它们),并提取 tar 二进制文件,我们可以测试行为:

$ for i in tar_1.27.1-2+b1_amd64 tar_1.27.1-2+deb8u1_amd64 ;做 \
  ls -la ${i}.deb && \
  deb2targz ${i}.deb && \
  mkdir -p $i && \
  tar -xf ${i}.tar.xz -C $i && \
  查找 $i -name tar -type f -perm /111 -ls \
  ;完毕 ;
# 第一个 Debian 软件包
-r--r--r-- 1 root root 675968 3月24日21:31 tar_1.27.1-2+b1_amd64.deb
# 将其转换为 tarball 以便解压
deb2targz:转换 'tar_1.27.1-2+b1_amd64.deb' ...
deb2targz:跳过“debian-binary”部分
deb2targz:跳过“control.tar.gz”部分
deb2targz:写入“tar_1.27.1-2+b1_amd64.tar.xz”
# 第一个 debian 包中的 Tar 二进制文件:
108669076 352 -rwxr-xr-x 1根根358072 2014年11月8日 tar_1.27.1-2+b1_amd64/bin/tar

# 第二个 debian 包
-r--r--r-- 1 root root 676278 三月 24 日 21:32 tar_1.27.1-2+deb8u1_amd64.deb

# 将其转换为 tarball 以便解压
deb2targz:转换“tar_1.27.1-2+deb8u1_amd64.deb”...
deb2targz:跳过“debian-binary”部分
deb2targz:跳过“control.tar.gz”部分
deb2targz:写入“tar_1.27.1-2+deb8u1_amd64.tar.xz”
# 第一个 debian 包中的 Tar 二进制文件:
543129777 352 -rwxr-xr-x 1根根358072 10月31日14:37 tar_1.27.1-2+deb8u1_amd64/bin/tar

现在我们已经提取了两个版本,我们可以将它们与测试命令的变体进行比较:

# 变量以明确我们正在使用哪一个:
$ tar1=./tar_1.27.1-2+b1_amd64/bin/tar
$ tar2=./tar_1.27.1-2+deb8u1_amd64/bin/tar

# 第一的
$ $tar1 --keep-directory-symlink czf /tmp/foo.tar.gz /tmp/foo
./tar_1.27.1-2+b1_amd64/bin/tar:您必须指定“-Acdtrux”、“--delete”或“--test-label”选项之一
尝试“./tar_1.27.1-2+b1_amd64/bin/tar --help”或
'./tar_1.27.1-2+b1_amd64/bin/tar --usage' 了解更多信息。

# 第二
$ $tar2 --keep-directory-symlink czf /tmp/foo.tar.gz /tmp/foo
./tar_1.27.1-2+deb8u1_amd64/bin/tar:您必须指定“-Acdtrux”、“--delete”或“--test-label”选项之一
尝试“./tar_1.27.1-2+deb8u1_amd64/bin/tar --help”或
'./tar_1.27.1-2+deb8u1_amd64/bin/tar --usage' 了解更多信息。

至于其他tar实现的讨论,请看我对一个tar实现之间差异问题的回答:https://unix.stackexchange.com/a/104172/54009

答案2

我可以通过附加 - czf 来修复它,但不确定是否等效

这是。联机帮助页需要花费大量时间来完成此操作。

基本上,您期望 tar 中出现相当奇怪的行为,因为长选项集包含短操作模式选项的别名。

tar --keep-directory-symlink czf b e

tar --create b e

tar --create zf b e

例如,您希望上面的最后一个命令做什么。您是否希望它zf在最后一种情况下被视为文件,而czf在第一种情况下不被视为文件?

相关内容