Zip
是否可以使用 zip 偽造目標目錄路徑?
給定目前目錄中的一堆文件,我希望能夠壓縮它們,以便在提取時將它們放置在某些給定目錄中。例如,假設我有這些
$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
我看不到使用該
zip
命令執行此操作的方法,但是在 python 中很容易。請注意,zip 文件格式規範第 4.4.17.1 節說路徑名不能以“/”開頭,所以我無法幫助解決這部分問題。
當您將文件添加到 zip 存檔時,python zipfile模組將允許您覆蓋文件的路徑名;只需將所需名稱作為可選的第二個參數傳遞給
ZipFile.write
:ZipFile.write(文件名
$$ , 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
將從路徑名中刪除任何前導“/”,以符合標準。