我正在尝试在 Linux 中运行这个命令:
tar zcvf ABCD.tar.gz -T Files.txt
我收到以下错误:
Error: tar: Removing leading `/' from member names
基于查找 /SED 在 crontab 的单行 tar 语句中将绝对路径转换为相对路径,我尝试了这个命令:
tar -C / -zcvf ABCD.tar.gz -T Files.txt
但我仍然收到相同的错误消息。
答案1
这是一个特点!
如果在压缩和提取过程中存档中包含斜杠/
前缀,则意味着攻击者只需说服您提取文件即可覆盖敏感文件(例如/etc/shadow
)。
它实际上不是一条错误消息,而是一条信息。
如果您确实想禁止它,请将目录更改为父目录并使用相对名称:
cd /
tar -zcvf path/to/files
而不是
tar -zcvf /path/to/files
就您而言,我认为 中的文件名-T Files.txt
是绝对位置。
答案2
在 GNU tar 中,如果你想保留文件名前面的斜杠,你需要的选项是:
-P, --absolute-names
Don't strip leading slashes from file names when creating archives.
所以,tar zcvf ABCD.tar.gz -P -T Files.txt
。
提取存档时,斜杠可能会被删除,当然除非您-P
也在那里使用。
另一方面,如果您想删除斜杠,但又不想 tar 抱怨,那么您需要执行类似的操作sed s,^/,, files.txt | tar czf foo.tar.gz -C / -T -
。
答案3
另一个可能的答案是,您确实希望存档具有可以安全提取的路径名,并且您希望从拥有的文件列表中删除前导斜杠。
在这种情况下,没有选项tar
,但您可以使用 生成tar
兼容文件pax
。
pax -s '#^/##' -wz < Files.txt > ABCD.tar.gz
-s '#^/##'
在将文件名写入存档时,会对文件名应用替换模式。这个剥夺了领先的/
.