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 .
Antworten:
0040000
ist der traditionelle Wert vonS_IFDIR
, dem Dateityp-Flag, das ein Verzeichnis darstellt. Der Typ verwendet die oberen 4 Bits des 16-Bit-st_mode
Werts und0100000
ist der Wert für reguläre Dateien.Die hohen 16 Bit der externen Dateiattribute scheinen für betriebssystemspezifische Berechtigungen verwendet zu werden. Die Unix-Werte sind dieselben wie bei herkömmlichen Unix-Implementierungen. Andere Betriebssysteme verwenden andere Werte. Informationen zu den in verschiedenen Betriebssystemen verwendeten Formaten finden Sie im Info-ZIP-Quellcode ( Download oder zB in Debian
apt-get source [zip or unzip]
) - relevante Dateien sindzipinfo.c
inunzip
und die plattformspezifischen Dateien inzip
.Diese sind üblicherweise in Oktal (Basis 8) definiert; Dies wird in C und Python dargestellt, indem der Zahl ein vorangestellt wird
0
.Diese Werte sind alle in
<sys/stat.h>
- link zur Version 4.4BSD zu finden . Diese sind nicht im POSIX-Standard enthalten (der stattdessen Testmakros definiert). stammen aber von AT & T Unix und BSD. (In GNU libc / Linux sind die Werte selbst als__S_IFDIR
etc in definiertbits/stat.h
, obwohl der Kernel-Header möglicherweise einfacher zu lesen ist - die Werte sind fast überall gleich.)Und natürlich sind die anderen 12 Bits für die Berechtigungen und setuid / setgid / sticky-Bits gleich wie für chmod:
Historisch gesehen liegt der Grund
0100000
für reguläre Dateien anstelle von 0 darin, dass in sehr frühen Versionen von Unix 0 für 'kleine' Dateien (diese verwendeten keine indirekten Blöcke im Dateisystem) und das hohe Bit des Modus-Flags war Für 'große' Dateien festlegen, die indirekte Blöcke verwenden würden. Die beiden anderen Typen, die dieses Bit verwenden, wurden in späteren von Unix abgeleiteten Betriebssystemen hinzugefügt, nachdem sich das Dateisystem geändert hatte.Zusammenfassend lässt sich sagen, dass das erweiterte Attributfeld für Unix insgesamt wie folgt aufgebaut ist
quelle
040755 << 16L
ist? Speziell, welche Repräsentation / Basis verwendet es (ich denke möglicherweise Octal ) und vor allem, wie weiß die Sprache (der Python-Interpreter in diesem Fall), was die Repräsentation ist? Hmm, vielleicht ist der Typ im C-Code deklariert. Aus welcher Datei erhalten Sie auch die "Dateityp" -Werte? Das Hinzufügen einiger Links / Verweise wäre hilfreich.zipinfo.c
es in der Quelle für das Entpacken unter Debian ist . Alternativ kann man die bequemere verwendenapt-get source unzip
. Sie können dies an Ihre Antwort anhängen oder eine nicht übertragene Quelle verwenden. Normalerweise zitiere ich Debian, weil ich glaube, dass sie auf lange040755
. Das wäre imo für Leute erwähnenswert, die es nicht wissen oder vergessen haben. Das lässt natürlich die Frage offen, woher es weiß, dass es sich um Basis 8 handelt, aber möglicherweise wird der Typ als Basis 8 deklariert.stat.h
Datei unter Linux (ich nehme an, die richtige Datei ist/usr/include/sys/stat.h
) enthält die Definition dieser Konstanten nicht so klar wie die Datei, mit der Sie verlinkt haben. Sind sie woanders versteckt? Ich sehe, Sie haben den Begriff verwendettest macros
, aber ich bin mir nicht sicher, was das bedeutet.