Dies ist eine etwas exotische Frage, aber es scheint nicht viele Informationen im Internet zu geben. Ich habe gerade eine Antwort auf eine Frage zum externen Dateiattribut des Zip-Formats hinzugefügt . Wie Sie meiner Antwort entnehmen können, komme ich zu dem Schluss, dass nur das zweite Byte (von 4 Bytes) tatsächlich für Unix verwendet wird. Anscheinend enthält diese Datei beim Entpacken genügend Informationen, um zu ermitteln, ob es sich bei dem Objekt um eine Datei oder ein Verzeichnis handelt. Außerdem ist Platz für andere Berechtigungs- und Attributinformationen vorhanden. Meine Frage ist, wie ordnet sich diese den üblichen Unix-Berechtigungen zu? ls
Passen die üblichen Unix-Berechtigungen (z. B. unten) in genau ein Byte, und wenn ja, kann jemand das Layout beschreiben oder eine Referenz angeben?
$ 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
Lassen Sie mich dies konkretisieren, indem ich eine bestimmte Frage stelle. Gemäß dem oben in meiner Antwort angegebenen Trac-Patch können Sie eine Zip-Datei mit dem folgenden Python-Snippet erstellen.
Der 040755 << 16L
Wert entspricht der Erstellung eines leeren Verzeichnisses mit den Berechtigungen drwxr-xr-x
. (Ich habe es getestet). Ich erkenne, 0755
entspricht dem rwxr-xr-x
Muster, aber was ist mit dem 04
, und wie entspricht der gesamte Wert einem Byte? Ich erkenne auch << 16L
, dass dies einer bitweisen Linksverschiebung von 16 Stellen entspricht, was dazu führen würde, dass es das zweite Byte von oben ist.
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()
BEARBEITEN: Beim erneuten Lesen denke ich, dass meine Schlussfolgerung, dass die Unix-Berechtigungen nur einem Byte entsprechen, falsch sein könnte, aber ich werde das Obige vorläufig stehen lassen, da ich nicht sicher bin, wie die richtige Antwort lautet.
EDIT2: Ich war in der Tat falsch über die Unix-Werte, die nur 1 Byte entsprechen. Wie @ Random832 erklärt hat, werden beide oberen zwei Bytes verwendet. Gemäß der Antwort von @ Random832 können wir den gewünschten 040755
Wert aus den unten angegebenen Tabellen konstruieren . Nämlich:
__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
Der Zusatz hier ist in der Basis 8 .