Esta es una pregunta un poco exótica, pero no parece haber mucha información en la red sobre esto. Acabo de agregar una respuesta a una pregunta sobre el atributo de archivo externo del formato zip . Como puede ver en mi respuesta, concluyo que solo el segundo byte (de 4 bytes) se usa realmente para Unix. Aparentemente, esto contiene suficiente información al descomprimir para deducir si el objeto es un archivo o un directorio, y también tiene espacio para otros permisos e información de atributos. Mi pregunta es, ¿cómo se asigna esto a los permisos habituales de Unix? ¿Los permisos habituales de Unix (p. Ej., A continuación) se ls
ajustan exactamente a un byte y, de ser así, ¿alguien puede describir el diseño o dar una referencia, por favor?
$ 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
Permítanme hacer esto más concreto haciendo una pregunta específica. Según el parche de Trac citado en mi respuesta anterior, puede crear un archivo zip con el fragmento de Python a continuación.
El 040755 << 16L
valor corresponde a la creación de un directorio vacío con los permisos drwxr-xr-x
. (Lo probé). Reconozco que 0755
corresponde al rwxr-xr-x
patrón, pero ¿qué pasa con el 04
, y cómo corresponde el valor completo a un byte? También reconozco que << 16L
corresponde a un desplazamiento a la izquierda bit a bit de 16 lugares, lo que lo haría terminar como el segundo desde el byte superior.
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()
EDITAR: Al releer esto, creo que mi conclusión de que los permisos de Unix solo corresponden a un byte puede ser incorrecta, pero dejaré que lo anterior represente el presente, ya que no estoy seguro de cuál es la respuesta correcta.
EDIT2: De hecho, era incorrecto acerca de los valores de Unix que solo corresponden a 1 byte. Como explicó @ Random832, utiliza los dos primeros bytes. Según la respuesta de @ Random832, podemos construir el 040755
valor deseado a partir de las tablas que da a continuación. A saber:
__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
La adición aquí está en la base 8 .