Tôi muốn biết làm thế nào các loại tệp được biết nếu tên tệp không có hậu tố.
Ví dụ, một tệp có tên myfile
là nhị phân hoặc văn bản để bắt đầu, làm thế nào để hệ thống biết nếu tệp là nhị phân hoặc văn bản?
Tôi muốn biết làm thế nào các loại tệp được biết nếu tên tệp không có hậu tố.
Ví dụ, một tệp có tên myfile
là nhị phân hoặc văn bản để bắt đầu, làm thế nào để hệ thống biết nếu tệp là nhị phân hoặc văn bản?
Câu trả lời:
Các file
tiện ích xác định filetype qua 3 cách:
Đầu tiên là kiểm tra hệ thống tập tin : Trong những thử nghiệm một trong những stat hệ thống gia đình các cuộc gọi được gọi vào tệp. Điều này trả về các loại tệp unix khác nhau : tệp thông thường, thư mục, liên kết, thiết bị ký tự, thiết bị khối, đường ống có tên hoặc ổ cắm. Tùy thuộc vào đó, các bài kiểm tra ma thuật được thực hiện.
Các bài kiểm tra ma thuật phức tạp hơn một chút. Các loại tệp được đoán bởi cơ sở dữ liệu các mẫu được gọi là tệp ma thuật . Một số loại tệp có thể được xác định bằng cách đọc một bit hoặc số ở một vị trí cụ thể trong tệp (ví dụ nhị phân). Tệp ma thuật chứa " số ma thuật " để kiểm tra tệp có chứa chúng hay không và thông tin văn bản nào sẽ được in. Những " số ma thuật " đó có thể là các giá trị 1-4Byte, chuỗi, ngày hoặc thậm chí là các biểu thức thông thường. Với các bài kiểm tra thêm thông tin có thể được tìm thấy. Trong trường hợp có thể thực thi được, thông tin bổ sung sẽ là liệu nó có được liên kết động hay không, bị tướchoặc không hoặc kiến trúc. Đôi khi nhiều bài kiểm tra phải vượt qua trước khi loại tập tin thực sự có thể được xác định. Nhưng dù sao đi nữa, không quan trọng là có bao nhiêu bài kiểm tra được thực hiện, nó luôn chỉ là một phỏng đoán tốt .
Dưới đây là 8 byte đầu tiên trong một tệp của một số kiểu tệp phổ biến có thể giúp chúng ta cảm nhận được những con số ma thuật này có thể trông như thế nào:
Hexadecimal ASCII
PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|....
JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex
JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF
ZIP 50 4B 03 04|0A 00 00 00 PK..|....
PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5
Nếu loại tệp không thể được tìm thấy qua các bài kiểm tra ma thuật, thì tệp đó dường như là một tệp văn bản và file
tìm mã hóa nội dung. Mã hóa được phân biệt bởi các phạm vi và chuỗi byte khác nhau tạo thành văn bản có thể in trong mỗi bộ.
Việc ngắt dòng cũng được điều tra, tùy thuộc vào giá trị HEX của chúng:
0A
( \n
) phân loại tệp kết thúc Un * x / Linux / BSD / OSX0D 0A
( \r\n
) là tệp từ hệ điều hành Microsoft0D
( \r
) sẽ là Mac OS cho đến phiên bản 915
( \025
) sẽ là IBM AIXBây giờ các bài kiểm tra ngôn ngữ bắt đầu. Nếu nó có vẻ là một tệp văn bản, tệp sẽ được tìm kiếm các chuỗi cụ thể để tìm ra ngôn ngữ mà nó chứa (C, Perl, Bash). Một số ngôn ngữ tập lệnh cũng có thể được xác định qua hàm băm ( #!/bin/interpreter
) trong dòng đầu tiên của tập lệnh.
Nếu không có gì áp dụng cho tệp, loại tệp không thể được xác định và file
chỉ in "dữ liệu".
Vì vậy, bạn thấy không cần hậu tố. Một hậu tố dù sao cũng có thể gây nhầm lẫn, nếu đặt sai.
file(1)
, nhưng với cách thực hiện (rất) khác nhau.
Thông thường, nó không quan tâm. Bạn chỉ cần chuyển nó đến một chương trình và nó sẽ giải thích nó hoặc không. Có thể không hữu ích khi mở .jpg trong trình soạn thảo văn bản, nhưng bạn không bị ngăn làm điều này. Phần mở rộng, giống như phần còn lại của tên tệp, là để thuận tiện cho tổ chức của con người.
Cũng có thể xây dựng các tệp có thể được giải thích hợp lệ theo nhiều cách. Vì định dạng tệp ZIP bắt đầu có một tiêu đề ở cuối tệp , bạn có thể thêm các thứ khác vào phía trước và nó vẫn sẽ tải dưới dạng tệp ZIP. Điều này thường được sử dụng để tạo các tệp zip tự giải nén.
Thông tin đó thường được tìm thấy trong tiêu đề của tập tin. Các file
lệnh phân tích các mục tiêu và cho bạn biết thông tin về các tập tin. Rất nhiều thông tin thường được lấy từ các tiêu đề tệp thường gấp vài byte đầu tiên của tệp (xem bên dưới). Các tiêu đề được sử dụng bởi hệ thống để tìm ra cách xử lý các tệp. #!/bin/bash
ở đầu tập tin báo cho hệ thống sử dụng bash shell để diễn giải đoạn script sau. ELF
nói với hệ thống rằng đây là một thực thi ELF.
[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[~] root@www # file /etc/passwd
/etc/passwd: ASCII text
Ví dụ tiêu đề tệp:
[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c ...4...o.....b.<
[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000 ..>......$@.....
[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20 "$1" ] && echo
file
lệnh cố gắng đoán từ các nội dung của tập tin như thế nào các tập tin có lẽ là dự định được sử dụng. Nó không phải là không thể sai lầm.
file
. Nó thực sự làm cho một phân tích của các tập tin. Tuy nhiên, hầu hết các loại tệp được xác định bởi một tiêu đề sắp xếp. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
là một tiêu đề của một thực thi ELF (vài byte đầu tiên của / bin / ls). Tương tự #!/bin/bash
ở đầu tệp ASCII sẽ xác định nó là tập lệnh shell. Một ví dụ khác: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(một hình ảnh .png)
Điều đầu tiên cần kiểm tra là loại tệp được mã hóa cứng được nhận dạng bởi kernel. Đây là các loại tệp như thư mục, tệp đặc biệt, tệp đặc biệt khối, tệp đặc biệt ống, ổ cắm và liên kết tượng trưng. Thông tin này đến từ inode của tập tin. Nếu tệp là một tệp đơn giản, bộ thông tin tiếp theo đến từ 256 byte đầu tiên bằng cách tìm kiếm các mẫu. Do đó, các tệp văn bản và mã nguồn C được nhận ra bằng cách kiểm tra các byte đó. Ngoài ra, các tiện ích cũng tìm kiếm một số ma thuật được sử dụng để kiểm tra và xác nhận loại tệp. Bạn có thể thêm các loại tệp của riêng mình để được nhận dạng bằng cách thêm thông tin vào tệp /etc/magic
. Tham khảo trang hướng dẫn magic(5)
để xem định dạng của tệp ma thuật.
Trong triển khai cũ hơn (ví dụ Solaris), tệp /etc/magic
liệt kê hầu hết các loại tệp được nhận dạng.
Các file
lệnh áp dụng một số chẩn đoán từ kiểm tra (một phần) các tập tin và thực hiện một đoán đủ điều kiện. Ngoài ra, có một số trường hợp đặc biệt có thể lấy thông tin bổ sung; như #!
ở phần đầu của tệp văn bản, BoM (dấu thứ tự byte) hoặc byte tiêu đề cụ thể của các định dạng tệp thực thi. Các #!
dấu và nhị phân trong các tệp thực thi được sử dụng bởi hệ thống để phân biệt chúng.
Hệ thống không biết liệu tệp là nhị phân hay văn bản. Trong tất cả (AFAIK) các hệ điều hành loại Unix, fopen(path, "rb")
hoàn toàn giống như fopen(path "r")
- b
không có tác dụng. Điều này được chấp nhận vì tiêu chuẩn C cần có thể được chuyển sang một số HĐH khác tạo nên sự khác biệt như vậy.
Tôi sẽ lập luận rằng "loại tệp" thậm chí không phải là một khái niệm có ý nghĩa trong Unix;
Trong những ngày tốt đẹp của những người chuyển đổi máy tính lớn, hệ điều hành của họ đã hỗ trợ một số loại tệp bao gồm tuần tự và tuần tự chỉ mục. Các hệ điều hành hiện đại (Un * x và Windows được cho là) giảm tập hợp các loại tệp xuống mức tối thiểu (bao gồm cả đối tượng dùng chung, có thể thực hiện được).
Cũng có thể xây dựng các tệp có thể được giải thích hợp lệ theo nhiều cách
Có thể, có một định dạng tệp khó: một đoạn mã C có thể được hiểu là một mô tả hình ảnh. Bên cạnh đó có các định dạng khác nhau ít hơn và cụ thể hơn: tệp văn bản, tệp XML, tài liệu SOAP.