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)
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)
Mar*_*ler 102
这实际上是一个功能,而不是一个问题。具有绝对位置的档案存在安全风险。攻击者可以使用此类档案来诱骗用户在关键系统位置安装文件。
是的,您可以使用-P
. 但是,允许 tar 删除正斜杠并简单地要求存档用户在根目录中明确进行提取有什么问题?然后他们有意识地影响关键的系统位置,并且不能偶然发生。
小智 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)
小智 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)