Zip formatının harici dosya özelliği


25

Bu biraz egzotik bir sorudur, ancak bu konuda net bilgi bulunmuyor. Ben sadece zip formatının harici dosya özniteliği hakkındaki bir soruya bir cevap ekledim . Cevabımdan da anlaşılacağı gibi, sadece ikinci baytın (4 bayt) Unix için kullanıldığına karar verdim. Görünüşe göre bu, nesnenin bir dosya mı yoksa bir dizin mi olduğunu ortaya çıkarmak için açarken yeterli bilgi içeriyor ve ayrıca diğer izin ve nitelik bilgileri için de alana sahip. Sorum şu, bu Unix izinlerine nasıl bakıyor? lsTam olarak bir bayta sığacak olan her zamanki Unix izinleri (örn. Aşağıda) var mı ve eğer öyleyse, birisi düzeni açıklayabilir veya referans verebilir mi?

$ 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

Belirli bir soru sorarak bunu daha somutlaştırmama izin verin. Yukarıdaki cevabımda belirtilen Trac yaması uyarınca, aşağıdaki Python pasajına sahip bir zip dosyası oluşturabilirsiniz.

040755 << 16LDeğeri izinlerine sahip boş bir dizin oluşturulması tekabül drwxr-xr-x. (Test ettim). Desene 0755karşılık geldiğini biliyorum rwxr-xr-x, ama peki ya 04tüm değer byte'a ne kadar karşılık gelir? Ayrıca << 16L16 yerin bitsel sola kaymasına karşılık geldiğini ve bu durumun en üstteki bayttan ikinci olarak çıkacağını biliyorum.

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: Bunu tekrar okuduğumda, Unix izinlerinin sadece bir bayta karşılık geldiği sonucumun yanlış olabileceğini düşünüyorum, fakat doğru cevabın ne olduğundan emin olamadığım için yukarıdakilerin şimdiki zaman için geçerli olmasına izin vereceğim.

EDIT2: Sadece 1 byte'a karşılık gelen Unix değerleri konusunda gerçekten yanılmışım. @ Random832'de açıklandığı gibi, ilk iki baytın her ikisini de kullanır. @ Random832'nin cevabına göre, 040755aşağıda verilen tablolardan istenen değeri oluşturabiliriz. Yani:

__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 

Buradaki ekleme 8 numaralı üstadır .


Zip izinleri hakkında hiçbir şey bilmiyorum, ancak geleneksel unix izinlerinin birden fazla bayt olan 12 bit kullandığını biliyorum. Belki de zip setxid ve yapışkan ile uğraşmaz, ama yine de 9 (rwx × ugo) bırakır.
Gilles 'SO- kötülük olmayı bırak'

Yanıtlar:


30

0040000Geleneksel, değer, S_IFDIRbir dizini temsil eden dosya türü bayrağı. Tür, 16 bitlik st_mode değerin ilk 4 bitini kullanır, 0100000normal dosyalar için değerdir.

Harici dosya özniteliklerinin 16 biti, işletim sistemine özgü izinler için kullanılıyor gibi görünmektedir. Unix değerleri, geleneksel unix uygulamalarındakilerle aynıdır. Diğer işletim sistemleri başka değerleri kullanır. Farklı işletim sistemleri çeşitli kullanılan formatlar hakkında bilgi Info-Posta kaynak kodunda (bulunabilir indirmek veya örneğin debian apt-get source [zip or unzip]) - ilgili dosyalardır zipinfo.ciçinde unzipve platforma özel dosyaları zip.

Bunlar geleneksel olarak oktalde tanımlanır (baz 8); bu, C ve python ile temsil edilir ve sayı a ile ön eklenir 0.

Bu değerler tüm bulunabilir <sys/stat.h>- 4.4BSD sürümüne bağlantı . Bunlar POSIX standardında değildir (bunun yerine test makrolarını tanımlar); ancak AT&T Unix ve BSD'den kaynaklanmaktadır. (GNU libc / Linux, değerler kendileri olarak tanımlanır __S_IFDIRvb bits/stat.holsa çekirdek başlık okumak daha kolay olabilir - değerler hemen hemen her yerde hep aynıdır.)

#define S_IFIFO  0010000  /* named pipe (fifo) */
#define S_IFCHR  0020000  /* character special */
#define S_IFDIR  0040000  /* directory */
#define S_IFBLK  0060000  /* block special */
#define S_IFREG  0100000  /* regular */
#define S_IFLNK  0120000  /* symbolic link */
#define S_IFSOCK 0140000  /* socket */

Ve elbette, diğer 12 bit, chmod ile aynı olan izinler ve setuid / setgid / sticky bitleri içindir:

#define S_ISUID 0004000 /* set user id on execution */
#define S_ISGID 0002000 /* set group id on execution */
#define S_ISTXT 0001000 /* sticky bit */
#define S_IRWXU 0000700 /* RWX mask for owner */
#define S_IRUSR 0000400 /* R for owner */
#define S_IWUSR 0000200 /* W for owner */
#define S_IXUSR 0000100 /* X for owner */
#define S_IRWXG 0000070 /* RWX mask for group */
#define S_IRGRP 0000040 /* R for group */
#define S_IWGRP 0000020 /* W for group */
#define S_IXGRP 0000010 /* X for group */
#define S_IRWXO 0000007 /* RWX mask for other */
#define S_IROTH 0000004 /* R for other */
#define S_IWOTH 0000002 /* W for other */
#define S_IXOTH 0000001 /* X for other */
#define S_ISVTX 0001000 /* save swapped text even after use */

Tarihsel bir not olarak, bunun nedeni 01000000 yerine normal dosyalar olması, unix'in çok eski sürümlerinde 0'ın 'küçük' dosyalar için (bunlar dosya sisteminde dolaylı bloklar kullanmadı) ve mod bayrağının yüksek bitinin olmasıdır. dolaylı blokları kullanacak 'büyük' ​​dosyalar için. Bu biti kullanan diğer iki tip daha sonra unix türevli işletim sistemlerinde dosya sistemi değiştikten sonra eklendi.

Bu nedenle, tamamlanmak üzere Unix için genişletilmiş öznitelikler alanının genel düzeni

TTTTsstrwxrwxrwx0000000000ADVSHR
^^^^____________________________ file type as explained above
    ^^^_________________________ setuid, setgid, sticky
       ^^^^^^^^^________________ permissions
                ^^^^^^^^________ This is the "lower-middle byte" your post mentions
                        ^^^^^^^^ DOS attribute bits

@ Random832: Vay, bu etkileyici bir şekilde tamamlandı. Değerin nasıl oluşturulduğunu da açıklayabilir misiniz 040755 << 16L? Spesifik olarak, hangi temsili / üssü kullanıyor (muhtemelen Octal olduğunu düşünüyorum ) ve en önemlisi, dilin (bu durumda Python yorumlayıcısı) temsilin ne olduğunu nasıl biliyor? Hmm, belki de C kodunda tip ilan edilir. Ayrıca, hangi dosyadan "dosya türü" değerleri alıyorsunuz? Bazı bağlantılar / referanslar eklemek faydalı olabilir.
Faheem Mitha

Random832 @: Anlıyorum zipinfo.colduğunu Debian üzerinde unzip için kaynak . Alternatif olarak, daha uygun olanı kullanabilirsiniz apt-get source unzip. Bunu cevabınıza ekleyebilir veya bir akış dışı kaynak kullanabilirsiniz. Genelde Debian'dan alıntı yaparım çünkü uzun süre boyunca etrafta olacağına inancım olur. :-)
Faheem Mitha

@ Random832: Tamam, sanırım bunun nasıl çalıştığını görüyorum. Tablonun 8 bazında ayarlanmış olan şeyler için tüm değerleri masanıza göre toplarsınız ve numarayı alırsınız 040755. Bu, bilmeyen ya da unutmuş insanlar için imodan bahsetmeye değer. Tabii ki, bu yine de nasıl üs 8 olduğunu bildiği sorusunu bırakıyor, ama belki de tür üs 8 olarak ilan edildi.
Faheem Mitha

Taban 8 çünkü 0 ile başlıyor. Bir düzenlemede şunu açıklığa kavuşturacağım
Random832

@Romom: Açıklama için teşekkürler. Önde gelen 0 sözleşmeden haberdar değildim. stat.hLinux üzerinde dosya (Ben doğru dosyayı olduğunu varsayarak yaşıyorum /usr/include/sys/stat.h) Eğer bağlantılı dosya olarak böyle net bir şekilde bu sabitleri tanımını içermez. Başka bir yere mi saklanmışlar? Terimi kullandığını görüyorum test macrosama bunun ne anlama geldiğinden emin değilim.
Faheem Mitha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.