这是一个有点陌生的问题,但是网上似乎没有太多有关此问题的信息。我刚刚添加了有关zip格式的外部文件属性的问题的答案。正如您从我的答案中看到的那样,我得出的结论是,Unix仅实际使用了第二个字节(共4个字节)。显然,当解压缩时,它包含足够的信息以推断对象是文件还是目录,并且还具有用于其他权限和属性信息的空间。我的问题是,这如何映射到通常的Unix权限?是否提供通常ls
恰好适合一个字节的常规Unix权限(例如下面的权限),如果可以,有人可以描述布局或提供参考吗?
$ ls -la
total 36
drwxr-xr-x 3 faheem faheem 4096 Jun 10 01:11 .
drwxrwxrwt 136 root root 28672 Jun 10 01:07 ..
-rw-r--r-- 1 faheem faheem 0 Jun 10 01:07 a
drwxr-xr-x 2 faheem faheem 4096 Jun 10 01:07 b
lrwxrwxrwx 1 faheem faheem 1 Jun 10 01:11 c -> b
让我通过提出一个具体问题来使其更加具体。根据上面我的答案中引用的Trac补丁,您可以使用下面的Python代码段创建一个zip文件。
该040755 << 16L
值对应于具有权限的空目录的创建drwxr-xr-x
。(我测试过)。我知道0755
对应于rwxr-xr-x
模式,但是呢04
,整个值如何对应一个字节?我还认识到<< 16L
对应于16位的按位左移,这将使其结束于从最高字节开始的第二个位置。
def makezip1():
import zipfile
z = zipfile.ZipFile("foo.zip", mode = 'w')
zfi = zipfile.ZipInfo("foo/empty/")
zfi.external_attr = 040755 << 16L # permissions drwxr-xr-x
z.writestr(zfi, "")
print z.namelist()
z.close()
编辑:在重读此内容时,我认为关于Unix权限仅对应一个字节的结论可能是不正确的,但由于我不确定正确的答案,因此我将上述观点作为目前的结论。
EDIT2:对于仅对应1个字节的Unix值,我确实是不正确的。正如@ Random832解释的那样,它使用了前两个字节。根据@ Random832的答案,我们可以040755
从下面提供的表中构造所需的值。即:
__S_IFDIR + S_IRUSR + S_IWUSR + S_IXUSR + S_IRGRP + S_IXGRP + S_IROTH + S_IXOTH
0040000 + 0400 + 0200 + 0100 + 0040 + 0010 + 0004 + 0001
= 40755
此处的加法在8的底数中。