![是否可以使用 zip 伪造目标目录路径?](https://linux22.com/image/41545/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20zip%20%E4%BC%AA%E9%80%A0%E7%9B%AE%E6%A0%87%E7%9B%AE%E5%BD%95%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
给定当前目录中的一堆文件,我希望能够对它们进行压缩,以便在提取时将它们放置在某些给定的目录中。例如,假设我有这些$PWD
:
ls
fsck
xz
chroot
当我运行时unzip foo.zip
,它们都会被提取到这些目录中:
/bin
/sbin
/usr/bin
/usr/sbin
我能找到的最接近的是这些文件必须已经存在于我想要将文件提取到的任何目录路径中(用作$PWD
根目录):
$ zip foo.zip bin/ls sbin/fsck usr/bin/xz usr/sbin/chroot
然后,在我希望进行提取的系统上,我必须:
$ cd /
$ sudo unzip foo.zip
答案1
我没有找到使用该zip
命令执行此操作的方法,但在 python 中很容易。
请注意,zip 文件格式规范,第 4.4.17.1 节,说路径名不能以“/”开头,所以我无法帮助解决该部分。
蟒蛇压缩文件当您将文件添加到 zip 存档时,模块将允许您覆盖文件的路径名;只需将所需的名称作为可选的第二个参数传递给ZipFile.write
:
ZipFile.write(filename[, arcname[, compress_type]])
将名为 filename 的文件写入存档,并为其指定存档名称 arcname (默认情况下,这与 filename 相同,但没有驱动器号并带有前导路径分隔符已删除)。如果给定, compress_type 会覆盖为新条目的构造函数提供的压缩参数的值。
注意:存档名称应相对于存档根目录,即它们不应以路径分隔符开头。
这是一个例子:
$ touch 1 2 3
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
>>> import zipfile
>>> with zipfile.ZipFile('bundle.zip', 'w') as bundle:
... bundle.write('1', '/bin/1')
... bundle.write('2', '/sbin/2')
... bundle.write('3', '/usr/bin/3')
...
>>>
$ unzip -l bundle
Archive: bundle.zip
Length Date Time Name
--------- ---------- ----- ----
0 2014-08-11 13:00 bin/1
0 2014-08-11 13:00 sbin/2
0 2014-08-11 13:00 usr/bin/3
--------- -------
0 3 files
请注意,zipfile.write
将从路径名中删除任何前导“/”,以符合标准。