คุณลักษณะไฟล์ภายนอกของรูปแบบซิป


25

นี่เป็นคำถามที่แปลกใหม่เล็กน้อย แต่ดูเหมือนจะไม่มีข้อมูลมากมายเกี่ยวกับเรื่องนี้ ฉันเพิ่งเพิ่มคำตอบสำหรับคำถามเกี่ยวกับแอตทริบิวต์แฟ้มรูปแบบซิปของภายนอก อย่างที่คุณเห็นจากคำตอบของฉันฉันสรุปว่ามีเพียงไบต์ที่สอง (จาก 4 ไบต์) เท่านั้นที่ใช้สำหรับ Unix เห็นได้ชัดว่าสิ่งนี้มีข้อมูลเพียงพอเมื่อทำการคลายซิปเพื่ออนุมานว่าวัตถุนั้นเป็นไฟล์หรือไดเรกทอรีและยังมีพื้นที่สำหรับการอนุญาตและข้อมูลคุณลักษณะอื่น ๆ คำถามของฉันคือแผนที่นี้ใช้สิทธิ์ Unix อย่างไร สิทธิ์ Unix ตามปกติ (เช่นด้านล่าง) ที่lsให้พอดีกับหนึ่งไบต์และถ้าเป็นเช่นนั้นใครสามารถอธิบายเลย์เอาต์หรือให้การอ้างอิงได้ไหม

$ 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

ให้ฉันทำสิ่งนี้เป็นรูปธรรมมากขึ้นโดยการถามคำถามเฉพาะ ตามแพทช์ Trac ที่ยกมาในคำตอบของฉันด้านบนคุณสามารถสร้างไฟล์ zip ด้วยส่วนของ Python ด้านล่าง

040755 << 16Lค่าสอดคล้องกับการสร้าง directory drwxr-xr-xว่างที่มีสิทธิ์ (ฉันทดสอบแล้ว) ฉันรับรู้0755สอดคล้องกับrwxr-xr-xรูปแบบ แต่สิ่งที่เกี่ยวกับการ04และมูลค่าทั้งหมดสอดคล้องกับไบต์? ฉันยังจำได้ว่า<< 16Lสอดคล้องกับการเปลี่ยนบิตซ้ายของสถานที่ 16 ซึ่งจะทำให้มันเป็นครั้งที่สองจากไบต์บน

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()

แก้ไข: ในการอ่านใหม่นี้ฉันคิดว่าข้อสรุปของฉันว่าสิทธิ์ Unix นั้นสอดคล้องกับหนึ่งไบต์เท่านั้นอาจไม่ถูกต้อง แต่ฉันจะยอมให้การยืนเหนือสำหรับปัจจุบันเพราะฉันไม่แน่ใจว่าคำตอบที่ถูกต้องคืออะไร

แก้ไข 2: ฉันไม่ถูกต้องแน่นอนเกี่ยวกับค่า Unix ที่สอดคล้องกับ 1 ไบต์เท่านั้น ตามที่ @ Random832 อธิบายจะใช้ทั้งสองไบต์บนสุด ตามคำตอบของ @ Random832 เราสามารถสร้าง040755มูลค่าที่ต้องการจากตารางที่เขาให้ด้านล่าง กล่าวคือ:

__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 

นอกจากนี้ที่นี่อยู่ในฐาน 8


ฉันไม่รู้อะไรเลยเกี่ยวกับการอนุญาตให้ใช้ zip แต่ฉันรู้ว่าการอนุญาต unix ดั้งเดิมใช้ 12 บิตซึ่งมากกว่าหนึ่งไบต์ บางที zip อาจไม่รบกวนกับ setxid และเหนียว แต่ก็ยังทิ้งไว้ 9 (rwx × ugo)
Gilles 'SO- หยุดความชั่วร้าย'

คำตอบ:


30

0040000เป็นค่าดั้งเดิมของS_IFDIRแฟล็กชนิดไฟล์ที่แสดงถึงไดเร็กทอรี ชนิดที่ใช้บน 4 บิตของ16 บิต st_modeค่า0100000คุ้มค่าสำหรับไฟล์ปกติ

ดูเหมือนว่าจะมีการใช้แอตทริบิวต์ไฟล์ภายนอกสูง 16 บิตสำหรับสิทธิ์เฉพาะระบบปฏิบัติการ ค่า Unix เหมือนกับการใช้ Unix แบบดั้งเดิม ระบบปฏิบัติการอื่นใช้ค่าอื่น ๆ ข้อมูลเกี่ยวกับรูปแบบที่ใช้ในความหลากหลายของระบบปฏิบัติการที่แตกต่างกันสามารถพบได้ในรหัสที่มาข้อมูลไปรษณีย์ ( ดาวน์โหลดหรือเช่นในเดเบียนapt-get source [zip or unzip]) - ไฟล์ที่เกี่ยวข้องzipinfo.cในและไฟล์เฉพาะแพลตฟอร์มในunzipzip

เหล่านี้ถูกกำหนดตามอัตภาพในฐานแปด (ฐาน 8); นี้เป็นตัวแทนใน C และงูหลามโดย prefixing 0จำนวนที่มี

ค่าเหล่านี้ทั้งหมดจะสามารถพบได้ใน<sys/stat.h>- เชื่อมโยงไปยัง 4.4BSD รุ่น สิ่งเหล่านี้ไม่ได้อยู่ในมาตรฐาน POSIX (ซึ่งกำหนดมาโครการทดสอบแทน); แต่มาจาก AT&T Unix และ BSD (ใน GNU libc / Linux ค่าเหล่านั้นถูกกำหนดเป็นอย่าง__S_IFDIRอื่นเป็นต้นbits/stat.hแม้ว่าส่วนหัวเคอร์เนลอาจอ่านง่ายกว่า - ค่าเหมือนกันหมดทุกที่)

#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 */

และแน่นอนอีก 12 บิตสำหรับการอนุญาตและบิต setuid / setgid / เหนียวเหมือนกับ chmod:

#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 */

เป็นบันทึกประวัติเหตุผล0100000สำหรับไฟล์ปกติแทนที่จะเป็น 0 คือในรุ่นแรก ๆ ของ unix, 0 เป็นไฟล์ 'เล็ก' (สิ่งเหล่านี้ไม่ได้ใช้บล็อกทางอ้อมในระบบไฟล์) และค่าสถานะโหมดสูง ตั้งค่าสำหรับไฟล์ 'ใหญ่' ซึ่งจะใช้บล็อกทางอ้อม อีกสองประเภทที่ใช้บิตนี้ถูกเพิ่มเข้ามาในระบบปฏิบัติการยูนิกซ์ในภายหลังหลังจากระบบไฟล์มีการเปลี่ยนแปลง

ดังนั้นในการสรุปเค้าโครงโดยรวมของฟิลด์คุณลักษณะเพิ่มเติมสำหรับ Unix คือ

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

@ Random832: ว้าวเสร็จสมบูรณ์และน่าประทับใจ คุณสามารถอธิบายวิธีสร้างมูลค่า040755 << 16Lได้อย่างไร โดยเฉพาะการเป็นตัวแทน / ฐานที่ใช้ (ฉันคิดว่าอาจเป็นOctal ) และที่สำคัญที่สุดวิธีการที่ภาษา (ล่าม Python ในกรณีนี้) รู้ว่าสิ่งที่เป็นตัวแทน? อืมอาจจะมีการประกาศประเภทไว้ในรหัส C นอกจากนี้ไฟล์ใดที่คุณได้รับค่า "ประเภทไฟล์" จาก การเพิ่มลิงค์ / อ้างอิงบางรายการจะมีประโยชน์
Faheem Mitha

@ Random832: ผมเห็นว่าzipinfo.cอยู่ในแหล่งสำหรับเครื่องรูดใน Debian หรืออีกวิธีหนึ่งก็สามารถใช้งานได้สะดวกapt-get source unzipกว่า คุณสามารถต่อท้ายคำตอบของคุณหรือใช้แหล่งที่มาไม่ได้ ฉันมักจะพูด Debian เพราะฉันมีความเชื่อว่าพวกเขาจะอยู่ได้นานลาก :-)
Faheem Mitha

@ Random832: ตกลงฉันคิดว่าฉันเห็นการทำงานนี้ คุณเพียงแค่เพิ่มค่าด้วยกันทั้งหมดสำหรับสิ่งที่จะตั้งอยู่ในฐาน 8 040755ตามตารางของคุณและคุณได้รับหมายเลข นั่นคงจะคุ้มค่าที่จะพูดถึง imo สำหรับคนที่ไม่รู้จักหรือลืมไปแล้ว แน่นอนว่ายังคงทิ้งคำถามที่ว่ามันรู้ว่ามันเป็นฐาน 8 แต่อาจจะประกาศเป็นประเภทที่ 8
Faheem Mitha

มันคือฐาน 8 เพราะมันเริ่มต้นด้วย 0 ฉันจะอธิบายอย่างชัดเจนในการแก้ไข
สุ่ม 832

@ สุ่ม: ขอบคุณสำหรับการชี้แจง ฉันไม่ได้ตระหนักถึงการประชุมที่นำ 0 stat.hไฟล์บนลินุกซ์ (ฉันสมมติว่าไฟล์ที่ถูกต้องเป็น/usr/include/sys/stat.h) ไม่ได้มีความหมายของค่าคงที่เหล่านี้ในลักษณะที่ชัดเจนเป็นไฟล์ที่คุณเชื่อมโยงกับ พวกเขาซ่อนตัวอยู่ที่อื่นหรือไม่? ฉันเห็นคุณใช้คำtest macrosนี้ แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร
Faheem Mitha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.