我遇到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
呢?
[这还不是真正的答案,但我会照此发布,因为无法在评论中格式化任何内容]
zip
不是从不可搜索的文件中提取时产生问题的唯一格式。这是一个带有多会话 iso 图像的示例,但至少bsdtar
打印了一条错误消息并且以非零状态退出。它应该对 zip 文件做同样的事情;恕我直言,默默地弄乱权限是不可接受的。这里的错误跟踪
libarchive
器是答案: