Essa é uma pergunta um pouco exótica, mas não parece haver muita informação na rede sobre isso. Acabei de adicionar uma resposta a uma pergunta sobre o atributo de arquivo externo do formato zip . Como você pode ver na minha resposta, concluo que apenas o segundo byte (de 4 bytes) é realmente usado para Unix. Aparentemente, isso contém informações suficientes ao descompactar para deduzir se o objeto é um arquivo ou um diretório e também possui espaço para outras informações de permissão e atributo. Minha pergunta é: como isso é mapeado para as permissões usuais do Unix? Faça as permissões usuais do Unix (por exemplo, abaixo) que se ls
encaixam em exatamente um byte e, nesse caso, alguém pode descrever o layout ou fornecer uma referência, 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
Deixe-me tornar isso mais concreto, fazendo uma pergunta específica. De acordo com o patch Trac citado na minha resposta acima, você pode criar um arquivo zip com o snippet de Python abaixo.
O 040755 << 16L
valor corresponde à criação de um diretório vazio com as permissões drwxr-xr-x
. (Eu testei). Reconheço que 0755
corresponde ao rwxr-xr-x
padrão, mas e quanto a 04
, e como o valor inteiro corresponde a um byte? Eu também reconheço que << 16L
corresponde a um deslocamento à esquerda bit a bit de 16 lugares, o que faria com que fosse o segundo do 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()
EDIT: Ao reler isso, acho que minha conclusão de que as permissões do Unix correspondem apenas a um byte pode estar incorreta, mas deixarei o exposto acima no momento, pois não tenho certeza de qual é a resposta correta.
EDIT2: Eu estava realmente incorreto sobre os valores Unix correspondentes apenas a 1 byte. Como o @ Random832 explicou, ele usa os dois primeiros bytes. Pela resposta de @ Random832, podemos construir o 040755
valor desejado a partir das tabelas que ele fornece abaixo. Nomeadamente:
__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
A adição aqui está na base 8 .