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 .
Réponses:
0040000
est la valeur traditionnelle deS_IFDIR
, l'indicateur de type de fichier représentant un répertoire. Le type utilise les 4 premiers bits de la valeur 16 bitsst_mode
,0100000
c'est la valeur des fichiers normaux.Les 16 bits élevés des attributs de fichiers externes semblent être utilisés pour les autorisations spécifiques au système d'exploitation. Les valeurs Unix sont les mêmes que sur les implémentations Unix traditionnelles. D'autres systèmes d'exploitation utilisent d'autres valeurs. Des informations sur les formats utilisés dans une variété d'OS différents peuvent être trouvées dans le code source Info-ZIP ( téléchargement ou par exemple dans debian
apt-get source [zip or unzip]
) - les fichiers pertinents sontzipinfo.c
dansunzip
et les fichiers spécifiques à la plate-forme danszip
.Celles-ci sont classiquement définies en octal (base 8); ceci est représenté en C et python en préfixant le nombre avec a
0
.Ces valeurs peuvent toutes être trouvées dans
<sys/stat.h>
- lien vers la version 4.4BSD . Ce ne sont pas dans la norme POSIX (qui définit à la place les macros de test); mais proviennent d'AT & T Unix et BSD. (dans GNU libc / Linux, les valeurs elles-mêmes sont définies comme__S_IFDIR
etc dansbits/stat.h
, bien que l'en- tête du noyau puisse être plus facile à lire - les valeurs sont toutes les mêmes à peu près partout.)Et bien sûr, les 12 autres bits sont pour les permissions et les bits setuid / setgid / sticky, les mêmes que pour chmod:
Comme note historique, la raison
0100000
pour les fichiers normaux au lieu de 0 est que dans les toutes premières versions d'Unix, 0 était pour les 'petits' fichiers (ceux-ci n'utilisaient pas de blocs indirects dans le système de fichiers) et le bit élevé de l'indicateur de mode était défini pour les «gros» fichiers qui utiliseraient des blocs indirects. Les deux autres types utilisant ce bit ont été ajoutés dans les systèmes d'exploitation ultérieurs dérivés d'Unix, après la modification du système de fichiers.Donc, pour conclure, la disposition générale du champ d'attributs étendus pour Unix est
la source
040755 << 16L
est construite? Plus précisément, quelle représentation / base utilise-t-il (je pense peut-être Octal ), et surtout, comment le langage (l'interpréteur Python dans ce cas) sait-il ce qu'est la représentation? Hmm, peut-être que le type est déclaré dans le code C. De plus, de quel fichier obtenez-vous les valeurs de "type de fichier"? L'ajout de liens / références serait utile.zipinfo.c
c'est dans la source pour décompresser sur Debian . Alternativement, on peut utiliser le plus pratiqueapt-get source unzip
. Vous pouvez ajouter cela à votre réponse ou utiliser une source non diffusée. Je cite habituellement Debian parce que j'ai confiance qu'ils seront là pour longtemps. :-)040755
. Cela vaut la peine de mentionner imo pour les personnes qui ne savent pas ou qui ont oublié. Bien sûr, cela laisse encore la question de savoir comment il sait qu'il est en base 8, mais peut-être que le type est déclaré en base 8.stat.h
fichier sous Linux (je suppose que le bon fichier l'est/usr/include/sys/stat.h
) ne contient pas la définition de ces constantes d'une manière aussi claire que le fichier auquel vous avez lié. Sont-ils cachés ailleurs? Je vois que vous avez utilisé le termetest macros
, mais je ne sais pas ce que cela signifie.