tar:从成员名称中删除前导“/”

sup*_*ser 179 tar gzip

root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Run Code Online (Sandbox Code Playgroud)

如何解决此问题并保留/文件名?

小智 108

如果您想摆脱打印到 STDERR 的“从成员名称中删除前导‘/’”,但仍想像 tar 那样在默认情况下明智地去掉那些前导斜杠,我评论者 timsoft 中看到了一个很好的解决方案。

解决方案包括使用 -C 选项将目录更改为根 (/),然后指定要存档的文件树而不使用前导斜杠,因为现在您只需要一个相对路径。这与普通的 tar create 命令执行相同的操作,但不需要剥离:

tar fcz bkup.tar.gz -C / home/foo/
Run Code Online (Sandbox Code Playgroud)

  • `-C /` 对我不起作用,句号。它不会阻止我的标准错误。 (3认同)
  • @ABB 确保 -C / 后面的路径是相对的。 (3认同)

Bar*_*mar 107

使用--absolute-names-P选项禁用此功能。

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,但请注意,**在大多数情况下,这不是您想要的**,因为它会导致在完整路径中提取的存档! (69认同)
  • 如果这是您的主要目标,则使用@Marcus 回答中描述的`-C /` 选项将消除 STDERR 消息。 (10认同)
  • 大多数时候这不是用户想要的,仅仅是因为他们中的大多数人在需要时才阅读手册(不是没有人有时间阅读)。因此,明智的做法是至少扩大您的答案,警告人们不要这样做,除非他们绝对确定自己了解它的影响。特别是被接受为答案。 (3认同)
  • 太好了,为什么不举个例子呢?这些命令去哪里了?在末尾?开始?介于两者之间? (3认同)

Mar*_*ler 102

这实际上是一个功能,而不是一个问题。具有绝对位置的档案存在安全风险。攻击者可以使用此类档案来诱骗用户在关键系统位置安装文件。

是的,您可以使用-P. 但是,允许 tar 删除正斜杠并简单地要求存档用户在根目录中明确进行提取有什么问题?然后他们有意识地影响关键的系统位置,并且不能偶然发生。

  • 有时功能是问题。我在设置了一个备份脚本后发现了这个线程,该脚本会发送来自`tar`的非零退出状态的电子邮件。这个特殊的消息导致 `tar` 以 `1` 的状态退出,这导致我在成功备份时收到错误的电子邮件警报,仅仅是因为 `tar` 正在将此消息写入 STDERR。我通过使用我自己的@Marcus 解决方案的调整版本解决了这个问题:`cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C /home/user/scripts 2>/dev/null || [发送电子邮件提醒]` (8认同)

小智 43

晚了一个月,但我发现最适合我的情况(在 shell 脚本中)的解决方案是转到父目录并在那里执行命令。

cd /var/www/
tar -czf mysite.gz mysite
Run Code Online (Sandbox Code Playgroud)

代替:

tar -czf /var/www/mysite.gz /var/www/mysite
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您可以使用: tar -zcvf mysite.gz -C /var/www/ mysite/ 这样做的好处是您可以从任何目录执行它 (11认同)

小智 8

这就是我使用蛮力方法做到的:2>&1 | grep -v "Removing leading".

例如:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"
Run Code Online (Sandbox Code Playgroud)

  • 问题在于它隐藏了错误代码。因此,如果您想在 bash 脚本中检查来自 tar 的错误代码,那么它不会在成功时返回 0。 (4认同)