Zip 형식의 외부 파일 속성


25

이것은 약간 이국적인 질문이지만 이것에 관한 정보는 많지 않습니다. 방금 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에 있습니다.


zip 권한에 대해서는 아무것도 모르지만 전통적인 유닉스 권한은 12 비트를 사용한다는 것을 알고 있습니다.이 비트는 1 바이트 이상입니다. 아마도 zip은 setxid와 sticky를 신경 쓰지 않지만 여전히 9 (rwx × ugo)를 남깁니다.
Gilles 'SO- 악마 그만'

답변:


30

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

@ Random832 : 와우, 그것은 완전히 완성되었습니다. 가치 040755 << 16L가 어떻게 구성 되는지 설명 할 수 있습니까 ? 특히, 어떤 표현 /베이스를 사용 하고 있습니까 ( 아마도 Octal 이라고 생각합니다 ) 가장 중요한 것은 언어 (이 경우 Python 해석기)가 표현이 무엇인지 어떻게 알 수 있습니까? 흠, 아마도 형식이 C 코드로 선언되었을 것입니다. 또한 "파일 형식"값을 얻는 파일은 무엇입니까? 일부 링크 / 참조를 추가하면 도움이됩니다.
Faheem Mitha

Random832 @ : 그 볼 zipinfo.c데비안에 압축 해제의 소스 . 또는 더 편리하게 사용할 수 있습니다 apt-get source unzip. 답변에 추가하거나 언 스트림 소스를 사용할 수 있습니다. 나는 그들이 장거리에있을 것이라는 믿음을 가지고 있기 때문에 데비안을 인용한다. :-)
Faheem Mitha

@ Random832 : 좋아, 이것이 어떻게 작동하는지 알 것입니다. 테이블에 따라 기본 8에 설정된 것들에 대한 모든 값을 더하면 숫자가 040755됩니다. 모르거나 잊어 버린 사람들을 위해 imo를 언급 할 가치가 있습니다. 물론, 그것은 여전히 ​​그것이 8 진법인지 어떻게 알 수 있는지에 대한 의문을 남기지 만, 아마도 유형은 8 진법으로 선언 될 것입니다.
Faheem Mitha

0으로 시작하기 때문에 기본 8입니다. 나는 편집에서
Random832

@Random : 설명해 주셔서 감사합니다. 나는 최고의 0 규칙을 알지 못했습니다. stat.hLinux 의 파일 (올바른 파일이 있다고 가정 함 /usr/include/sys/stat.h)에는 링크 된 파일과 같은 명확한 방법으로 이러한 상수의 정의가 포함되어 있지 않습니다. 그들은 다른 곳에 숨겨져 있습니까? 나는 당신이 용어를 사용하는 test macros것을 보았지만 그것이 무엇을 의미하는지 잘 모르겠습니다.
Faheem Mitha 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.