tar默认剥离绝对路径前缀以防止覆盖系统文件,推荐用-c切换工作目录打包相对路径,或解压时指定非根目标目录;若用--transform需注意gnu专属兼容性限制。

直接用绝对路径打包(如 /etc/hosts)时,tar 默认会警告 Removing leading '/' from member names,并自动剥离开头的 /,归档内实际存储为 etc/hosts。解压时若不加 -C /,文件会落到当前目录下的 ./etc/hosts;但若误用 tar -xzf archive.tar.gz -C /,就可能覆盖系统文件——这正是风险所在。
关键不是“能不能用绝对路径”,而是“怎么让归档内容安全、可控、可预期”。
以下三种实用方式,按推荐顺序排列:
用 -C 切换工作目录再指定相对路径(最通用、最安全)
原理:不依赖 tar 自动去斜杠,而是主动控制归档内的路径结构。
操作示例:
tar -czvf backup.tar.gz -C / etc/hosts -C /var/log nginx/access.log
效果:归档中是 etc/hosts 和 var/log/nginx/access.log,解压到任意目录都只生成对应子路径,绝不会写入 / 下。
✅ 兼容所有 tar(包括 BusyBox)、无版本限制、逻辑清晰。
对已打包的含根路径归档,解压时不指定 -C /(最简单补救)
如果你已经用了 tar -cf archive.tar /etc/hosts 且归档里存的是 /etc/hosts(即用了 -P 或 GNU tar 未自动 strip),那么:
- ✅ 正确解压方式:
tar -xf archive.tar -C /tmp/restore(指定非根目标目录) - ❌ 危险操作:
tar -xf archive.tar -C /(直接解到根,覆盖风险极高)
验证方法:先用tar -tvf archive.tar | head看路径是否带/前缀。
用 --transform 手动重写路径(GNU tar 专属,适合批量处理)
仅当必须保留原始绝对路径调用习惯时使用:
tar -czvf logs.tar.gz --transform 's|^/||' /var/log/syslog /root/.bashrc
该命令将 /var/log/syslog → var/log/syslog,/root/.bashrc → root/.bashrc。
⚠️ 注意:BSD tar、macOS tar、BusyBox tar 不支持 --transform,生产环境慎用。
无论选哪种,打包后务必用 tar -tvf xxx.tar.gz | head -5 检查归档内路径是否不含前导 /,这是防止覆盖的根本依据。











