Saya ingin tahu bagaimana tipe file diketahui jika nama file tidak memiliki akhiran.
Sebagai contoh, file bernama myfile
bisa biner atau teks untuk memulai, bagaimana sistem tahu jika file tersebut biner atau teks?
Saya ingin tahu bagaimana tipe file diketahui jika nama file tidak memiliki akhiran.
Sebagai contoh, file bernama myfile
bisa biner atau teks untuk memulai, bagaimana sistem tahu jika file tersebut biner atau teks?
Jawaban:
The file
utilitas menentukan filetype lebih dari 3 cara:
Pertama tes sistem file : Di dalam tes tersebut salah satu panggilan sistem keluarga stat dipanggil pada file. Ini mengembalikan berbagai jenis file unix : file biasa, direktori, tautan, perangkat karakter, perangkat blok, pipa bernama atau soket. Tergantung pada itu, tes ajaib dilakukan.
The tes sihir yang sedikit lebih kompleks. Jenis file ditebak oleh database pola yang disebut file ajaib . Beberapa jenis file dapat ditentukan dengan membaca sedikit atau angka di tempat tertentu di dalam file (misalnya binari). File ajaib berisi " angka ajaib " untuk menguji file apakah itu berisi angka atau tidak dan info teks mana yang harus dicetak. " Angka ajaib " itu bisa berupa nilai 1-4Byte, string, tanggal, atau bahkan ekspresi reguler. Dengan tes lebih lanjut, informasi tambahan dapat ditemukan. Dalam kasus yang dapat dieksekusi, informasi tambahan akan apakah itu terkait secara dinamis atau tidak, dilucutiatau tidak atau arsitekturnya. Kadang-kadang beberapa tes harus lulus sebelum tipe file dapat benar-benar diidentifikasi. Tapi bagaimanapun, tidak peduli berapa banyak tes yang dilakukan, itu selalu hanya tebakan yang bagus .
Berikut adalah 8 byte pertama dalam file dari beberapa tipe file umum yang dapat membantu kita mengetahui seperti apa angka-angka ajaib ini:
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
Jika jenis file tidak dapat ditemukan di atas pengujian ajaib, file tersebut tampaknya berupa file teks dan file
mencari penyandian konten. Pengkodean dibedakan oleh rentang dan urutan byte yang berbeda yang merupakan teks yang dapat dicetak di setiap set.
Jeda baris juga diselidiki, tergantung pada nilai HEX mereka:
0A
( \n
) mengklasifikasikan file terminasi Un * x / Linux / BSD / OSX0D 0A
( \r\n
) adalah file dari sistem operasi Microsoft0D
( \r
) akan menjadi Mac OS hingga versi 915
( \025
) adalah IBM AIXSekarang tes bahasa dimulai. Jika tampaknya berupa file teks, file tersebut dicari string tertentu untuk mengetahui bahasa yang dikandungnya (C, Perl, Bash). Beberapa bahasa skrip juga dapat diidentifikasi melalui hashbang ( #!/bin/interpreter
) di baris pertama skrip.
Jika tidak ada yang berlaku pada file, tipe file tidak dapat ditentukan dan file
hanya mencetak "data".
Jadi, Anda lihat tidak perlu sufiks. Akhiran tetap bisa membingungkan, jika salah.
file(1)
dilakukan, tetapi dengan implementasi (sangat) berbeda.
Seringkali, itu tidak peduli. Anda hanya meneruskannya ke program dan menafsirkannya atau tidak. Mungkin tidak berguna untuk membuka .jpg dalam editor teks, tetapi Anda tidak dapat melakukan hal ini. Ekstensi, seperti nama file lainnya, adalah untuk kenyamanan organisasi manusia.
Dimungkinkan juga untuk membuat file yang dapat diinterpretasikan secara sah dalam berbagai cara. Karena mulai format file ZIP memiliki header di akhir file , Anda dapat menambahkan hal-hal lain ke depan dan masih akan memuat sebagai file ZIP. Ini biasanya digunakan untuk membuat file zip self-extracting.
Informasi itu biasanya ditemukan di header file. The file
perintah menganalisis target dan memberitahu Anda informasi tentang file. Banyak informasi sering berasal dari header file yang sering kali beberapa byte pertama dari file (lihat di bawah). Header digunakan oleh sistem untuk mencari cara menangani file. #!/bin/bash
di awal file memberitahu sistem untuk menggunakan bash shell untuk menafsirkan skrip berikut. ELF
memberitahu sistem bahwa ini adalah executable 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
Contoh tajuk file:
[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
perintah mencoba menebak dari isi file bagaimana file tersebut mungkin dimaksudkan untuk digunakan. Itu tidak sempurna.
file
. Itu sebenarnya membuat analisis file. Namun, sebagian besar jenis file diidentifikasi oleh semacam header. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
adalah header dari executable ELF (beberapa byte pertama dari / bin / ls). Demikian pula #!/bin/bash
di bagian atas file ASCII akan mengidentifikasinya sebagai skrip shell. Contoh lain: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(gambar .png)
Hal pertama yang perlu diperiksa adalah jenis file yang dikodekan keras yang dikenali oleh kernel. Ini adalah jenis file seperti direktori, file karakter-khusus, file blok-khusus, file pipa-khusus, soket, dan tautan simbolik. Informasi ini berasal dari inode file. Jika file tersebut adalah file biasa, kumpulan informasi berikutnya berasal dari 256 byte pertama dengan mencari pola. Dengan demikian, file teks dan kode sumber C dikenali dengan memeriksa byte-byte tersebut. Selain itu, utilitas juga mencari angka ajaib yang digunakan untuk menguji dan memvalidasi jenis file. Anda dapat menambahkan jenis file Anda sendiri untuk dikenali dengan menambahkan informasi ke file /etc/magic
. Lihat halaman manual untuk magic(5)
melihat format file ajaib.
Dalam implementasi yang lebih lama (Solaris, misalnya), file tersebut /etc/magic
menyebutkan sebagian besar jenis file yang dikenali.
The file
perintah berlaku beberapa heuristik dari pemeriksaan (bagian dari) file dan membuat tebakan yang berkualitas. Di luar itu ada beberapa kasus khusus di mana informasi tambahan dapat diperoleh; seperti #!
di awal file teks, BoM (tanda urutan byte), atau byte header spesifik dari format file yang dapat dieksekusi. Tanda #!
biner dalam executable digunakan oleh sistem untuk membedakannya.
Sistem tidak tahu apakah file itu biner atau teks. Secara keseluruhan (AFAIK) sistem operasi Unix-type, fopen(path, "rb")
persis sama dengan fopen(path "r")
- b
tidak memiliki efek. Itu diterima karena standar C harus portabel untuk beberapa OS lain yang memang membuat perbedaan.
Saya berpendapat bahwa "tipe file" bahkan bukan konsep yang bermakna di bawah Unix;
Di masa lalu yang baik dari mainframe commputers OS mereka mendukung beberapa jenis file termasuk sekuensial dan sekuensial indeks. Sistem operasi modern (Un * x dan bisa dibilang Windows) mengurangi set jenis file ke minimum (termasuk dieksekusi, objek bersama).
Dimungkinkan juga untuk membuat file yang dapat diinterpretasikan secara sah dalam berbagai cara
Ada kemungkinan, ada format file yang rumit: sepotong kode C yang dapat diartikan sebagai deskripsi gambar. Selain itu ada berbagai format yang kurang dan lebih spesifik: file teks, file XML, dokumen SOAP.