Executable

為什麼從標準輸入讀取 ZIP 存檔時,libarchive 的 bsdtar 的解壓縮會丟棄權限位,而不是直接?

  • December 12, 2018

我遇到bsdtar包中的命令libarchive(至少在 Arch Linux 下).zip在讀取時確實會丟棄 -archives中的執行檔位stdin,但在直接處理文件時不會。

.tar-archives 上,它在從標準輸入讀取時也會保留可執行位。

測試案例:

創建檔案:

創建文件:

touch a.txt
chmod 644 a.txt
touch a.out
chmod 755 a.out

文件權限:

ls -ln a.out a.txt

節目

-rwxr-xr-x 1 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 1 1001 1001 0 Dec 12 11:01 a.txt

將文件打包成檔案:

bsdtar --format=zip -cf a.zip a.out a.txt
bsdtar -cf a.tar a.out a.txt

zip(使用和tar而不是創建檔案bsdtar會產生相同的結果。)

直接提取/顯示存檔內容:

bsdtar -tvf a.zip

或者

bsdtar -tvf - < a.zip

節目

-rwxr-xr-x  0 1001   1001        0 Dec 12 11:01 a.out
-rw-r--r--  0 1001   1001        0 Dec 12 11:01 a.txt

的可執行位在a.out此處。的權限a.out是 755 和a.txt644。

讀自stdin

cat a.zip | bsdtar -tvf -

節目

-rw-rw-r--  0 1001   1001        0 Dec 12 11:01 a.out
-rw-rw-r--  0 1001   1001        0 Dec 12 11:01 a.txt

for 的可執行位在a.out這裡被丟棄。此外,這兩個文件都是組可寫的,它們不是這樣打包的。a.out和的權限a.txt都是664。

.tar-檔案:

作為比較,對於.tar-archive,從以下管道讀取時也會尊重存檔中的權限stdin

bsdtar --numeric-owner -tvf a.tar

cat a.tar | bsdtar --numeric-owner -tvf -

都顯示

-rwxr-xr-x  0 1001   1001        0 Dec 12 11:01 a.out
-rw-r--r--  0 1001   1001        0 Dec 12 11:01 a.txt

(注意,當顯示 ZIP 存檔的內容時,bsdtar預設顯示數字所有者;對於 TAR 存檔,它顯示所有者的名稱。)

問題是:

stdin有什麼特別之處bsdtar?為什麼只在從管道中讀取時,而不是在時尚中bsdtar -tvf - < a.zip?為什麼對-archive特別,對.zip-archive不特別.tar呢?

這裡的錯誤跟踪libarchive器是答案:

Zip 檔案包含兩種不同的方式來描述內容:

  1. 每個條目的標題
  2. zip 文件末尾的中央目錄。

如果可以對輸入進行搜尋,libarchive(以及擴展的 bsdtar)將使用中央目錄,否則它將回退到僅流式處理邏輯。正如您在測試案例中發現的那樣,這些條目不一定一致。對此,我們能做或想做的實在不多。請注意,您可以將 wget 替換為普通的 cat,它仍然會顯示相同的行為。

簡短的版本是,這是 zip 文件流的固有問題,並且無法修復。

引用自:https://unix.stackexchange.com/questions/487338