在不解压的情况下更改 zip 中文件的权限

Sir*_*exe 5 permissions zip

有没有办法在不解压缩文件的情况下修改 zip 中文件的权限?澄清一下,我并不是要求更改文件的内容,而是要求更改文件中设置的 Unix 权限。除了提取和更新文件之外,我还没有找到答案。

Edu*_*ani 5

是的,有时有。无需太深入地了解细节,Zip 文件有每个文件的条目列表,最后还有另一个条目总结它们。这些条目可能有也可能没有文件权限,这取决于工具(及其版本)、文件系统、Zip 格式……但如果有,您可以修改它们。

以下步骤在 Debian 10 上测试。

让我们创建一个 zip 文件:

$ echo "This is file 1" > file1.txt
$ chmod 777 file1.txt
$ echo "This is file 2" > file2.txt
$ chmod 555 file2.txt
$ zip files file?.txt
Run Code Online (Sandbox Code Playgroud)

然后列出文件和权限:

$ zipinfo files.zip

Archive:  files.zip
Zip file size: 344 bytes, number of entries: 2
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:35 file1.txt
-r-xr-xr-x  3.0 unx       15 tx stor 20-Jun-08 18:30 file2.txt
2 files, 30 bytes uncompressed, 30 bytes compressed:  0.0%
Run Code Online (Sandbox Code Playgroud)

现在,我们可以手动迭代条目,但有一个程序已经执行此操作并打印结果:

$ zipdetail files.zip
Run Code Online (Sandbox Code Playgroud)

这会输出大量信息。左侧有偏移量,旁边有每个字段的名称和内容。

我们只想要Ext File Attributes每个文件:

$ zipdetails files.zip | egrep "Ext File Attributes|Filename"

001A Filename Length       0009
001E Filename              'file1.txt'
006C Filename Length       0009
0070 Filename              'file2.txt'
00C0 Filename Length       0009
00CA Ext File Attributes   81FF0000
00D2 Filename              'file1.txt'
010F Filename Length       0009
0119 Ext File Attributes   816D0001
0121 Filename              'file2.txt'
Run Code Online (Sandbox Code Playgroud)

现在,让我们修改权限,通过写入file2.txt(的文件属性 到偏移量(十进制 281, 的文件属性) 并考虑到字节顺序:7770x81FF0000file1.txt0x0119file2.txt

$ printf "\x00\x00\xff\x81" | dd of=files.zip bs=1 seek=281 count=4 conv=notrunc
Run Code Online (Sandbox Code Playgroud)

并再次列出内容:

$ zipinfo files.zip
Archive:  files.zip
Zip file size: 344 bytes, number of entries: 2
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:35 file1.txt
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:30 file2.txt
2 files, 30 bytes uncompressed, 30 bytes compressed:  0.0%
Run Code Online (Sandbox Code Playgroud)

现在两个文件共享相同的权限。

如果您想设置自己的权限,可以从 Zip 中的现有文件中复制它们或在此处检查它们。


ras*_*spi -3

这是不可能的。

ZIP 文件格式并非源自 UNIX 系统,因此没有任何 UNIX 相关的权限支持。