zip格式的外部文件属性


25

这是一个有点陌生的问题,但是网上似乎没有太多有关此问题的信息。我刚刚添加了有关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的底数中


我对zip权限一无所知,但是我知道传统的unix权限使用12位,即一个字节以上。也许zip不会困扰setxid和粘性,但是仍然留下9(rwx×ugo)。
吉尔(Gilles)'所以

Answers:


30

0040000是的传统值S_IFDIR,代表目录的文件类型标志。该类型使用16位 st_mode值的高4位,即0100000常规文件的值。

外部文件属性的高16位似乎用于特定于OS的权限。Unix值与传统的unix实现相同。其他操作系统使用其他值。有关在各种不同OS中使用的格式的信息,可以在Info-ZIP源代码(下载或例如在debian中apt-get source [zip or unzip])中找到-相关文件位于zipinfo.cunzip,而特定于平台的文件位于中zip

这些通常按照八进制(以8为基)进行定义。这在C和python中通过在数字前面加上来表示0

这些数值都可以在发现<sys/stat.h>- 链路4.4BSD版本。这些不在POSIX标准中(该标准定义了测试宏);但起源于AT&T Unix和BSD。(在GNU libc / Linux中,值本身在中定义为__S_IFDIRetc bits/stat.h,尽管内核标头可能更易于阅读-各地的值几乎相同。)

#define S_IFIFO  0010000  /* named pipe (fifo) */
#define S_IFCHR  0020000  /* character special */
#define S_IFDIR  0040000  /* directory */
#define S_IFBLK  0060000  /* block special */
#define S_IFREG  0100000  /* regular */
#define S_IFLNK  0120000  /* symbolic link */
#define S_IFSOCK 0140000  /* socket */

当然,其他12位用于权限和setuid / setgid / sticky位,与chmod相同:

#define S_ISUID 0004000 /* set user id on execution */
#define S_ISGID 0002000 /* set group id on execution */
#define S_ISTXT 0001000 /* sticky bit */
#define S_IRWXU 0000700 /* RWX mask for owner */
#define S_IRUSR 0000400 /* R for owner */
#define S_IWUSR 0000200 /* W for owner */
#define S_IXUSR 0000100 /* X for owner */
#define S_IRWXG 0000070 /* RWX mask for group */
#define S_IRGRP 0000040 /* R for group */
#define S_IWGRP 0000020 /* W for group */
#define S_IXGRP 0000010 /* X for group */
#define S_IRWXO 0000007 /* RWX mask for other */
#define S_IROTH 0000004 /* R for other */
#define S_IWOTH 0000002 /* W for other */
#define S_IXOTH 0000001 /* X for other */
#define S_ISVTX 0001000 /* save swapped text even after use */

作为历史记录,原因0100000是常规文件而不是0,这是因为在非常早的unix版本中,0是“小”文件(这些文件在文件系统中未使用间接块),而模式标志的高位是为使用间接块的“大”文件设置。文件系统更改后,其他使用此位的其他类型在后来的unix派生的OS中添加。

因此,总结起来,Unix扩展属性字段的总体布局为

TTTTsstrwxrwxrwx0000000000ADVSHR
^^^^____________________________ file type as explained above
    ^^^_________________________ setuid, setgid, sticky
       ^^^^^^^^^________________ permissions
                ^^^^^^^^________ This is the "lower-middle byte" your post mentions
                        ^^^^^^^^ DOS attribute bits

@ Random832:哇,令人印象深刻的完整和完整。您还可以解释值040755 << 16L的构造方式吗?具体来说,它使用什么表示/基础(我想可能是Octal),最重要的是,语言(在这种情况下为Python解释器)如何知道表示是什么?嗯,也许类型是在C代码中声明的。另外,您从哪个文件获取“文件类型”值?添加一些链接/参考会很有帮助。
Faheem Mitha

@ Random832:我看到这zipinfo.c是在Debian上解压缩源代码中。另一种选择是可以使用更方便apt-get source unzip。您可以将其附加到答案中,也可以使用流媒体源。我通常引用Debian,因为我相信它们会长期存在。:-)
Faheem Mitha

@ Random832:好的,我想我知道它是如何工作的。您只需将根据表在基数8中设置的所有值加在一起,就可以得到数字040755。对于那些不认识或忘记了的人来说,这值得一提。当然,仍有它如何知道它的问题是基地8,但也许类型被声明为基地8
Faheem米撒

它以8为底,因为它以0开头。我将在编辑中澄清这一点
Random832 2011年

@Random:感谢您的澄清。我不知道开头的0约定。stat.hLinux上的文件(我假设正确的文件是/usr/include/sys/stat.h)不像链接到的文件那样清楚地包含这些常量的定义。他们藏在别处吗?我看到您使用了术语test macros,但是我不确定这是什么意思。
Faheem Mitha
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.