Bagaimana tipe file diketahui jika bukan dari akhiran file?


55

Saya ingin tahu bagaimana tipe file diketahui jika nama file tidak memiliki akhiran.

Sebagai contoh, file bernama myfilebisa biner atau teks untuk memulai, bagaimana sistem tahu jika file tersebut biner atau teks?


3
Hanya komentar, sisa jawaban mencakup semuanya. Saat ini mungkin terjadi bahwa dengan lokal yang tidak terkonfigurasi atau file executable lama, beberapa file utf-8 dapat salah dideteksi sebagai data biner karena byte non-ascii.
orion

19
Sistem tidak peduli. Aplikasi tertentu mungkin peduli, tetapi mereka masing-masing memiliki cara sendiri untuk menangani ini.
jwodder

2
Perhatikan bahwa bahkan untuk file biasa (bukan file perangkat, soket domain unix, pipa bernama, dll) "tipe file" dapat berarti dua hal yang berbeda: (1) Format file tertentu (".docx", XML, format teks MS-DOS , RTF, catatan panjang tetap, daftarnya bisa sangat panjang) atau (2) File yang diketahui oleh aplikasi tertentu bagaimana menangani (".xlsx" atau ".doc" atau apa pun, ada tumpang tindih dengan jenis format) . Sebaiknya ingat perbedaan itu ketika berbicara tentang "tipe file".
Bruce Ediger

@ jwodder Sistem tidak peduli. Ini adalah sistem yang mengeluh Anda tidak dapat menjalankan file yang tidak dapat dieksekusi ketika Anda mencoba, bukan aplikasi itu!
Tn. Lister

1
@ Tuan True, tetapi executable / non-executable tidak ada hubungannya dengan 'ekstensi'.
user2338816

Jawaban:


84

The fileutilitas 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 filemencari 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 / OSX
  • 0D 0A( \r\n) adalah file dari sistem operasi Microsoft
  • 0D( \r) akan menjadi Mac OS hingga versi 9
  • 15( \025) adalah IBM AIX

Sekarang 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 filehanya mencetak "data".

Jadi, Anda lihat tidak perlu sufiks. Akhiran tetap bisa membingungkan, jika salah.


4
Ada juga basis data MIME yang dibagikan freedesktop.org, yang pada dasarnya digunakan oleh semua aplikasi X11. Ini mirip dalam konsep dengan apa yang file(1)dilakukan, tetapi dengan implementasi (sangat) berbeda.
lcd047

4
Perhatikan bahwa hasil dari proses ini pada dasarnya adalah dugaan, dan tidak boleh diandalkan untuk hal-hal penting. (Fitur kenyamanan, seperti memutuskan program default untuk membuka file dengan, baik-baik saja)
user253751

Jadi jika saya menambahkan% PNG di bagian atas file teks, itu akan dilihat sebagai file png. Baik??
Saga

@ Saga Jika Anda mendapatkan encoding yang benar dan jika Anda meletakkan tanda per mil bukan tanda persen maka: mungkin. Mungkin ada tes tambahan.
Bananguin

19

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.


4
Kembali ke paragraf terakhir: Format File Funky adalah pembicaraan yang menarik tentang subjek itu, menghadirkan misalnya jpeg yang juga merupakan program java hello world, setelah AES mengenkripsinya menjadi PNG, atau setelah 3DES mendekripsi itu menjadi PDF dan banyak lagi ( semua dengan konten "menarik", yaitu tidak hanya dengan white noise atau artefak)
Hagen von Eitzen

14

Informasi itu biasanya ditemukan di header file. The fileperintah 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/bashdi awal file memberitahu sistem untuk menggunakan bash shell untuk menafsirkan skrip berikut. ELFmemberitahu 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

3
Ini agak menyesatkan. File Unix tidak memiliki "header" per se. The fileperintah mencoba menebak dari isi file bagaimana file tersebut mungkin dimaksudkan untuk digunakan. Itu tidak sempurna.
Nate Eldredge

Anda benar dalam cara Anda menjelaskan perilaku 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/bashdi bagian atas file ASCII akan mengidentifikasinya sebagai skrip shell. Contoh lain: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR(gambar .png)
h3rrmiller

2
Tetapi jawaban Anda membuatnya terdengar seperti header adalah fitur yang melekat pada file Unix. File teks, misalnya, tidak memiliki header seperti itu; seseorang seperti OP mungkin akan mempertimbangkan file sumber C dan file sumber Java memiliki "tipe file" yang berbeda, tetapi tidak ada header untuk membedakannya. Saya berpendapat bahwa "tipe file" bahkan bukan konsep yang bermakna di bawah Unix; sistem operasi hanya menyediakan sistem file, dan terserah masing-masing aplikasi untuk memutuskan apa arti dari setiap file yang diberikan.
Nate Eldredge

Saya setuju. Saya mencoba menjawab sesederhana mungkin tanpa turun terlalu banyak lubang kelinci.
h3rrmiller

7

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/magicmenyebutkan sebagian besar jenis file yang dikenali.


4

The fileperintah 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.


4

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")- btidak memiliki efek. Itu diterima karena standar C harus portabel untuk beberapa OS lain yang memang membuat perbedaan.


0

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.


1
Saat format file berjalan, XPM tidak terlalu rumit. Saya menganggap "rumit" untuk memulai dengan sesuatu yang merupakan JPEG yang valid dan file ZIP yang valid.
Tandai
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.