C'est une question un peu exotique, mais il ne semble pas y avoir beaucoup d'informations sur le net à ce sujet. Je viens d'ajouter une réponse à une question sur l'attribut de fichier externe du format zip . Comme vous pouvez le voir dans ma réponse, je conclus que seul le deuxième octet (de 4 octets) est réellement utilisé pour Unix. Apparemment, cela contient suffisamment d'informations lors de la décompression pour déduire si l'objet est un fichier ou un répertoire, et dispose également d'un espace pour d'autres informations d'autorisation et d'attribut. Ma question est, comment cette carte correspond-elle aux autorisations Unix habituelles? Faites les autorisations Unix habituelles (par exemple ci-dessous) qui ls
correspondent à exactement un octet, et si oui, quelqu'un peut-il décrire la mise en page ou donner une référence, s'il vous plaît?
$ 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
Permettez-moi de rendre cela plus concret en posant une question spécifique. Selon le patch Trac cité dans ma réponse ci-dessus, vous pouvez créer un fichier zip avec l'extrait de Python ci-dessous.
La 040755 << 16L
valeur correspond à la création d'un répertoire vide avec les autorisations drwxr-xr-x
. (Je l'ai testé). Je reconnais que cela 0755
correspond au rwxr-xr-x
motif, mais qu'en est-il du 04
, et comment la valeur entière correspond-elle à un octet? Je reconnais également que cela << 16L
correspond à un décalage gauche au niveau du bit de 16 positions, ce qui le ferait finir comme le deuxième à partir de l'octet supérieur.
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: En relisant cela, je pense que ma conclusion que les autorisations Unix ne correspondent qu'à un octet peut être incorrecte, mais je laisserai ce qui précède représenter le présent, car je ne suis pas sûr de la bonne réponse.
EDIT2: J'avais en effet tort sur les valeurs Unix ne correspondant qu'à 1 octet. Comme l'a expliqué @ Random832, il utilise les deux premiers octets. Selon la réponse de @ Random832, nous pouvons construire la 040755
valeur souhaitée à partir des tableaux qu'il donne ci-dessous. À savoir:
__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'addition ici est en base 8 .