该代码在 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 tar
、star
、中看到的行为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
在第一种情况下不被视为文件?