Questa è una domanda leggermente esotica, ma non sembrano esserci molte informazioni in rete su questo. Ho appena aggiunto una risposta a una domanda sull'attributo del file esterno del formato zip . Come puoi vedere dalla mia risposta, concludo che solo il secondo byte (di 4 byte) viene effettivamente utilizzato per Unix. Apparentemente questo contiene informazioni sufficienti quando si decomprime per dedurre se l'oggetto è un file o una directory e ha anche spazio per altre informazioni su autorizzazioni e attributi. La mia domanda è: come si associa alle consuete autorizzazioni Unix? Esistono le consuete autorizzazioni Unix (ad es. Sotto) che si lsadattano esattamente a un byte e, in tal caso, qualcuno può descrivere il layout o fornire un riferimento, per favore?
$ 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
Vorrei renderlo più concreto ponendo una domanda specifica. Per la patch Trac citata nella mia risposta sopra, puoi creare un file zip con lo snippet di Python di seguito.
Il 040755 << 16Lvalore corrisponde alla creazione di una directory vuota con le autorizzazioni drwxr-xr-x. (L'ho provato). Riconosco 0755corrisponde al rwxr-xr-xmodello, ma per quanto riguarda il 04, e in che modo l'intero valore corrisponde a un byte? Riconosco anche che << 16Lcorrisponde a uno spostamento bit a sinistra di 16 posizioni, che lo farebbe finire come il secondo dal byte superiore.
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()
EDIT: Nel rileggere questo, penso che la mia conclusione che le autorizzazioni Unix corrispondono solo a un byte possa essere errata, ma lascerò che quanto sopra sia valido per il momento, poiché non sono sicuro di quale sia la risposta corretta.
EDIT2: in effetti non ero corretto riguardo ai valori Unix corrispondenti solo a 1 byte. Come spiegato da @ Random832, utilizza entrambi i primi due byte. Per la risposta di @ Random832, possiamo costruire il 040755valore desiderato dalle tabelle che fornisce di seguito. Vale a dire:
__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
L'aggiunta qui è nella base 8 .