Đây là một câu hỏi hơi kỳ lạ, nhưng dường như không có nhiều thông tin trên mạng về điều này. Tôi vừa thêm một câu trả lời cho một câu hỏi về thuộc tính tệp bên ngoài của định dạng zip . Như bạn có thể thấy từ câu trả lời của tôi, tôi kết luận rằng chỉ có byte thứ hai (gồm 4 byte) thực sự được sử dụng cho Unix. Rõ ràng điều này chứa đủ thông tin khi giải nén để suy ra liệu đối tượng là tệp hay thư mục và cũng có không gian cho thông tin thuộc tính và quyền khác. Câu hỏi của tôi là, làm thế nào để bản đồ này với các quyền Unix thông thường? Các quyền Unix thông thường (ví dụ bên dưới) có ls
phù hợp với chính xác một byte không, và nếu vậy, ai đó có thể mô tả bố cục hoặc đưa ra một tham chiếu không, làm ơn?
$ 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
Hãy để tôi làm điều này cụ thể hơn bằng cách đặt một câu hỏi cụ thể. Theo bản vá Trac được trích dẫn trong câu trả lời của tôi ở trên, bạn có thể tạo một tệp zip với đoạn mã Python bên dưới.
Các 040755 << 16L
giá trị tương ứng với việc tạo ra một thư mục rỗng với các điều khoản drwxr-xr-x
. (Tôi đã thử nó). Tôi nhận ra 0755
tương ứng với rwxr-xr-x
mẫu, nhưng còn về 04
giá trị và toàn bộ giá trị tương ứng với một byte thì sao? Tôi cũng nhận ra << 16L
tương ứng với sự dịch chuyển trái của bit theo 16 bit, điều này sẽ làm cho nó kết thúc dưới dạng thứ hai từ byte trên cùng.
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: Khi đọc lại điều này, tôi nghĩ rằng kết luận của tôi rằng các quyền Unix chỉ tương ứng với một byte có thể không chính xác, nhưng tôi sẽ để ý ở trên cho hiện tại, vì tôi không chắc câu trả lời đúng là gì.
EDIT2: Tôi thực sự không chính xác về các giá trị Unix chỉ tương ứng với 1 byte. Như @ Random832 đã giải thích, nó sử dụng cả hai byte trên cùng. Mỗi câu trả lời của @ Random832, chúng ta có thể xây dựng 040755
giá trị mong muốn từ các bảng anh ta đưa ra dưới đây. Cụ thể là:
__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
Việc bổ sung ở đây là trong cơ sở 8 .