To nieco egzotyczne pytanie, ale wydaje się, że w sieci nie ma dużo informacji na ten temat. Właśnie dodałem odpowiedź na pytanie dotyczące zewnętrznego atrybutu pliku formatu zip . Jak widać z mojej odpowiedzi, dochodzę do wniosku, że tylko drugi bajt (z 4 bajtów) jest faktycznie używany dla Uniksa. Najwyraźniej zawiera to wystarczającą ilość informacji podczas rozpakowywania, aby wywnioskować, czy obiekt jest plikiem, czy katalogiem, a także ma miejsce na inne informacje o uprawnieniach i atrybutach. Moje pytanie brzmi: w jaki sposób mapuje się to na zwykłe uprawnienia Unix? Czy zwykłe uprawnienia uniksowe (np. Poniżej), które ls
pasują do dokładnie jednego bajtu, a jeśli tak, czy ktoś może opisać układ lub podać odniesienie, proszę?
$ 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
Pozwólcie, że uściślę to, zadając konkretne pytanie. Zgodnie z cytowaną w mojej odpowiedzi łatką Trac możesz utworzyć plik zip z fragmentem kodu Pythona poniżej.
040755 << 16L
Wartość odpowiada utworzenia pustego katalogu z uprawnieniami drwxr-xr-x
. (Przetestowałem to). Wiem, że 0755
odpowiada rwxr-xr-x
wzorowi, ale co z tym 04
i jak cała wartość odpowiada bajtowi? Zauważyłem również, że << 16L
odpowiada bitowe przesunięcie w lewo o 16 miejsc, co sprawiłoby, że skończyłoby to na drugim miejscu od górnego bajtu.
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()
EDYCJA: Po ponownym przeczytaniu tego, uważam, że mój wniosek, że uprawnienia Unix odpowiadają tylko jednemu bajtowi, może być niepoprawny, ale pozwolę powyższemu zastąpić teraźniejszość, ponieważ nie jestem pewien, jaka jest prawidłowa odpowiedź.
EDYCJA 2: Rzeczywiście, myliłem się co do wartości uniksowych odpowiadających tylko 1 bajtowi. Jak wyjaśniono w @ Random832, wykorzystuje on dwa górne dwa bajty. Na odpowiedź @ Random832 możemy skonstruować pożądaną 040755
wartość z tabel, które podaje poniżej. Mianowicie:
__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
Dodatek znajduje się tutaj w bazie 8 .