Ini adalah pertanyaan yang agak eksotis, tetapi sepertinya tidak ada banyak informasi di internet tentang ini. Saya baru saja menambahkan jawaban untuk pertanyaan tentang atribut file eksternal format zip . Seperti yang Anda lihat dari jawaban saya, saya menyimpulkan bahwa hanya byte kedua (4 byte) yang benar-benar digunakan untuk Unix. Rupanya ini berisi informasi yang cukup ketika membuka ritsleting untuk menyimpulkan apakah objek adalah file atau direktori, dan juga memiliki ruang untuk izin lainnya dan informasi atribut. Pertanyaan saya adalah, bagaimana cara memetakan ini ke izin Unix yang biasa? Apakah izin Unix yang biasa (misalnya di bawah) yang ls
memberikan kesesuaian tepat satu byte, dan jika demikian, dapatkah seseorang menggambarkan tata letak atau memberikan referensi, tolong?
$ 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
Biarkan saya membuat ini lebih konkret dengan mengajukan pertanyaan spesifik. Per tambalan Trac yang dikutip dalam jawaban saya di atas, Anda dapat membuat file zip dengan potongan Python di bawah ini.
The 040755 << 16L
nilai sesuai dengan penciptaan direktori kosong dengan izin drwxr-xr-x
. (Saya mengujinya). Saya mengenali 0755
koresponden dengan rwxr-xr-x
pola, tetapi bagaimana dengan 04
, dan bagaimana seluruh nilai sesuai dengan byte? Saya juga mengenali << 16L
berkorespondensi dengan pergeseran kiri bitwise 16 tempat, yang akan membuatnya berakhir sebagai yang kedua dari byte atas.
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: Pada membaca ulang ini, saya pikir kesimpulan saya bahwa izin Unix hanya sesuai dengan satu byte mungkin salah, tetapi saya akan membiarkan di atas berdiri untuk saat ini, karena saya tidak yakin apa jawaban yang benar.
EDIT2: Saya memang salah tentang nilai-nilai Unix hanya sesuai dengan 1 byte. Seperti yang dijelaskan oleh @ Random832, ia menggunakan kedua dari dua byte teratas. Per @ Random832 menjawab, kita bisa membuat nilai yang diinginkan 040755
dari tabel yang dia berikan di bawah ini. Yaitu:
__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
Tambahan di sini ada di basis 8 .