zip形式の外部ファイル属性

zip形式の外部ファイル属性

ちょっと変な質問なのにオンラインにはこれに関する情報が多くないようです。追加しました。zip形式の外部ファイル属性に関する質問に対する回答。私の答えからわかるように、Unixでは実際には2番目のバイト(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ビットのビット左シフトに対応することに気づきました。これは上から2番目のバイトになります。

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で表されます。Python番号を前に付けることで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 */

歴史的に0100000ゼロ以外の通常のファイルがある理由は、以前のバージョンのUnixでは、0は「小さい」ファイル(このファイルはファイルシステムで間接ブロックを使用していない)を示し、モードフラグの上位ビットは間接参照が「ラージ」です。 「ファイルをチャンクとして使用するように設定されています。このビットを使用する2つの異なるタイプは、ファイルシステムが変更された後、UNIXベースのオペレーティングシステムに追加されました。

要約すると、Unix 拡張属性フィールドの一般的なレイアウトは次のようになります。

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

おすすめ記事