[unix] Zip 형식의 외부 파일 속성

이것은 약간 이국적인 질문이지만 이것에 관한 정보는 많지 않습니다. 방금 zip 형식의 외부 파일 속성에 대한 질문에 대한 답변을 추가 했습니다 . 내 대답에서 알 수 있듯이 실제로 두 번째 바이트 (4 바이트) 만 실제로 Unix에 사용된다는 결론을 내립니다. 분명히 이것은 압축 해제시 오브젝트가 파일인지 디렉토리인지를 추론하기에 충분한 정보를 포함하고 있으며 다른 권한 및 속성 정보를위한 공간도 있습니다. 제 질문은 이것이 일반적인 Unix 권한에 어떻게 매핑됩니까? ls정확히 1 바이트에 맞는 일반적인 유닉스 권한 (예 : 아래)을 수행 하고 있다면 누군가 레이아웃을 설명하거나 참조 할 수 있습니까?

$ 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에 패치 위의 내 대답 인용, 아래 파이썬의 조각을 가진 zip 파일을 만들 수 있습니다.

040755 << 16L값은 권한을 가진 빈 디렉토리의 생성에 해당한다 drwxr-xr-x. (나는 그것을 테스트했다). 패턴에 0755해당한다는 것을 알고 rwxr-xr-x있지만의 04경우는 어떻습니까? 그리고 전체 값이 바이트에 어떻게 대응합니까? 또한 << 16L16 자리의 비트 단위 왼쪽 시프트에 해당하므로 최상위 바이트에서 두 번째로 끝납니다.

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 권한이 1 바이트에만 해당한다는 결론은 틀릴 수 있지만 정답이 무엇인지 확실하지 않기 때문에 위의 내용을 현재 상태로 두겠습니다.

EDIT2 : 실제로 1 바이트에 해당하는 유닉스 값에 대해서는 틀 렸습니다. @ Random832가 설명했듯이 상위 2 바이트를 모두 사용합니다. @ 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에 있습니다.



답변

0040000S_IFDIR디렉토리를 나타내는 파일 유형 플래그 인 전통적인 값입니다 . 유형은 16 비트 st_mode 값 의 상위 4 비트를 사용하며 0100000일반 파일의 값입니다.

외부 파일 속성의 상위 16 비트는 OS 별 권한에 사용되는 것 같습니다. 유닉스 값은 전통적인 유닉스 구현과 동일합니다. 다른 OS는 다른 값을 사용합니다. 다른 운영체제의 다양한에서 사용되는 형식에 대한 정보는 정보-ZIP 소스 코드 (에서 찾을 수 있습니다 다운로드 또는 예에서 데비안 apt-get source [zip or unzip]) – 관련 파일은 zipinfo.cunzip, 그리고 플랫폼 별 파일에 zip.

이들은 일반적으로 8 진법으로 정의됩니다 (기본 8). 이것은 C와 python 에서 숫자 앞에 a를 붙여서 나타냅니다 0.

이 값은 모두에서 찾을 수 있습니다 <sys/stat.h>4.4BSD 버전 링크 . 이것들은 POSIX 표준이 아닙니다 (테스트 매크로를 대신 정의합니다). AT & T Unix와 BSD에서 시작되었습니다. (GNU libc의 / 리눅스에서, 값은 그 자체로 정의되는 __S_IFDIR등의 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 비트는 chmod와 동일하게 권한 및 setuid / setgid / sticky 비트를위한 것입니다.

#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 */

역사적으로, 01000000이 아닌 일반 파일 의 이유 는 유닉스의 초기 버전에서 0은 ‘작은’파일 (파일 시스템에서 간접 블록을 사용하지 않았 음)에 대한 것이고 모드 플래그의 높은 비트는 간접 블록을 사용하는 ‘큰’파일로 설정됩니다. 이 비트를 사용하는 다른 두 가지 유형은 파일 시스템이 변경된 후 나중에 유닉스 파생 OS에서 추가되었습니다.

결론적으로 Unix의 확장 속성 필드의 전체 레이아웃은

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


답변