zip 형식의 외부 파일 속성

zip 형식의 외부 파일 속성

좀 이상한 질문인데 온라인에는 이에 대한 정보가 많지 않은 것 같습니다. 방금 추가했어요zip 형식의 외부 파일 속성에 대한 질문에 대한 답변. 내 답변에서 볼 수 있듯이 Unix에서는 실제로 두 번째 바이트(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 패치위 답변에서 인용한 대로 아래 Python 코드 조각을 사용하여 zip 파일을 만들 수 있습니다.

040755 << 16L값은 권한이 있는 빈 디렉터리를 만드는 것과 같습니다 drwxr-xr-x. (나는 그것을 테스트했다). 0755해당 rwxr-xr-x패턴 에 해당하는 것으로 알고 있는데 , 04전체 값이 어떻게 1바이트에 해당합니까? 나는 또한 << 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 권한은 1바이트에만 해당한다는 결론이 틀릴 수도 있다고 생각합니다. 그러나 정답이 무엇인지 확신할 수 없으므로 지금은 위의 내용을 그대로 두겠습니다.

EDIT2: 나는 1바이트에만 해당하는 Unix 값에 대해 실제로 틀렸습니다. @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.

답변1

0040000S_IFDIR예, 디렉터리의 파일 형식 플래그를 나타내는 기존 값입니다 . 이 유형은 처음 4자리 숫자를 사용합니다.16비트 st_modevalue는 0100000일반 파일의 값입니다.

외부 파일 속성의 상위 16비트는 운영 체제별 권한에 사용되는 것으로 보입니다. Unix 값은 기존 Unix 구현과 동일합니다. 다른 운영 체제에서는 다른 값을 사용합니다. 다양한 운영 체제에서 사용되는 형식에 대한 정보는 Info-ZIP 소스 코드(다운로드또는 예: debian apt-get source [zip or unzip]) - 관련 파일은 zipinfo.c에 있고 unzip플랫폼별 파일은 에 있습니다 zip.

이들은 일반적으로 8진수(8진수)로 정의되며 C로 표시됩니다.파이썬번호를 앞에 붙임으로써 0.

<sys/stat.h>이 값은 - 에서 찾을 수 있습니다 .4.4BSD 버전 링크. 이는 POSIX 표준이 아니지만(대신 테스트 매크로가 정의됨) AT&T Unix 및 BSD에서 파생되었습니다. (GNU libc/Linux에서는 값 자체가 __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은 "작은" 파일(이 파일은 파일 시스템에서 간접 블록을 사용하지 않았음)을 나타내고 모드 플래그의 상위 비트가 간접 참조가 "대형" 파일을 청크로 사용하도록 설정됩니다. 이 비트를 사용하는 두 가지 다른 유형은 파일 시스템이 변경된 후 이후 UNIX 기반 운영 체제에 추가되었습니다.

요약하면 Unix 확장 속성 필드의 일반적인 레이아웃은 다음과 같습니다.

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

관련 정보