Executable
為什麼從標準輸入讀取 ZIP 存檔時,libarchive 的 bsdtar 的解壓縮會丟棄權限位,而不是直接?
我遇到
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.txt
644。讀自
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 檔案包含兩種不同的方式來描述內容:
- 每個條目的標題
- zip 文件末尾的中央目錄。
如果可以對輸入進行搜尋,libarchive(以及擴展的 bsdtar)將使用中央目錄,否則它將回退到僅流式處理邏輯。正如您在測試案例中發現的那樣,這些條目不一定一致。對此,我們能做或想做的實在不多。請注意,您可以將 wget 替換為普通的 cat,它仍然會顯示相同的行為。
簡短的版本是,這是 zip 文件流的固有問題,並且無法修復。