Perintah file Linux: mengenali format, MIME, dan encoding

Perintah file di Linux memperkirakan format file dari metadata sistem file, pola byte dalam isinya, dan karakteristik teks. Pendeteksiannya tidak bergantung pada ekstensi nama file, sehingga berguna untuk mengenali format, jenis program, encoding karakter, dan tipe MIME meskipun ekstensi hilang atau keliru.

Artikel ini menjelaskan segala sesuatu mulai dari penggunaan dasar hingga output MIME, menangani tautan simbolik dan file terkompresi, memeriksa beberapa file, menggunakan skrip shell, dan langkah-langkah pencegahan saat menafsirkan hasil.

Apa itu perintah file?

file memeriksa setiap jalur yang diberikan sebagai argumen dan mengeluarkan deskripsi tipe file yang dapat dibaca manusia.

Contoh berikut mengasumsikan utilitas file beserta basis data magic sudah terpasang dan tersedia melalui PATH. Nama seperti README.md, photo.jpg, dan backup.tar.gz adalah contoh: gunakan file milik Anda yang sudah ada. Jalur program seperti /usr/bin/python3 bergantung pada distribusi dan paket yang terpasang.

file README.md
file photo.jpg
file /usr/bin/ls

Berikut ilustrasi keluaran, bukan hasil yang pasti untuk setiap mesin. Teks UTF-8 memerlukan isi yang sesuai; baris ELF menggambarkan program Linux x86-64, sedangkan arsitektur, versi file, dan basis data magic dapat mengubah detailnya.

README.md: Unicode text, UTF-8 text
photo.jpg:  JPEG image data, JFIF standard 1.01
/usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, dynamically linked

file membaca dan mengkategorikan konten tanpa memodifikasinya. Namun, izin akses ke file diperlukan, dan waktu akses dapat diperbarui tergantung pada metode pemeriksaan.

Bagaimana file menentukan tipe file

Sebuah implementasi file yang khas melakukan pemeriksaan berikut secara berurutan dan menggunakan hasil pemeriksaan pertama yang berhasil sebagai deskripsi default.

  1. Pemeriksaan sistem file: Periksa tipe-tipe seperti direktori, tautan simbolik, soket, FIFO, dan file kosong melalui metadata.
  2. Pemeriksaan magic: Bandingkan pola byte unik pada lokasi tertentu dalam sebuah file dengan database magic.
  3. Pemeriksaan teks dan bahasa: Periksa encoding karakter dan ciri isi untuk memperkirakan format teks atau bahasa pemrograman yang digunakan.

File dengan informasi identifikasi tetap dalam formatnya, seperti PNG, JPEG, PDF, dan executable ELF, dapat diklasifikasikan bahkan tanpa ekstensi. Sebaliknya, file tanpa pola unik atau konten yang terlalu pendek dan ambigu mungkin hanya ditampilkan sebagai data.

Sintaks dasar dan penggunaan

file [opsi] berkas...

Anda dapat memeriksa tidak hanya satu file tetapi beberapa jalur sekaligus.

file report.pdf
file image.png archive.tar.gz script.sh
file /etc /dev/null /usr/bin/env

Jalur dengan spasi atau karakter khusus shell harus diletakkan dalam tanda kutip, dan gunakan penanda akhir opsi -- sebelum nama file yang diawali dengan tanda hubung.

file "annual report.pdf"
file -- -sample.bin

Anda dapat memeriksa versi yang terpasang dan opsi yang didukung dengan perintah berikut.

file --version
file --help
man file

Bandingkan ekstensi dan format file yang sebenarnya

Periksa format meskipun tanpa ekstensi

File eksekusi Linux atau skrip perintah sering kali tidak memiliki ekstensi. file dapat memeriksa format dengan melihat isi daripada nama.

file /usr/bin/bash
file /usr/bin/python3
file ./run-backup

Jika sebuah skrip memiliki shebang, informasi interpreter dapat disertakan dalam hasil, dan program yang dikompilasi mungkin menunjukkan format ELF, arsitektur, dan apakah penghubung dinamis digunakan.

Periksa file dengan ekstensi yang salah

Ini juga berguna ketika ekstensi dari file yang diunduh atau diterima tidak sesuai dengan isi sebenarnya.

file download.dat
file attachment.bin

Meskipun hasil menunjukkan format gambar atau kompresi, file tidak otomatis mengganti namanya. Tentukan ekstensi setelah memeriksa aplikasi pembuka dan aturan kerja yang berlaku.

Menafsirkan hasil yang umum

Contoh keluaran Arti
directory Ini adalah direktori, bukan file biasa.
symbolic link to ... Ini adalah tautan simbolik yang menunjuk ke jalur lain.
empty Ini adalah file biasa kosong dengan ukuran 0 byte.
ASCII text Ini terutama teks yang terdiri dari karakter yang dapat dicetak dalam rentang ASCII.
Unicode text, UTF-8 Ditetapkan sebagai teks Unicode yang dikodekan dalam UTF-8.
ELF ... executable Ini adalah file eksekusi format ELF yang digunakan di Linux dan sistem lainnya.
shared object Dapat menunjukkan pustaka bersama atau executable independen posisi, bergantung pada struktur file dan versi pendeteksi.
data Ini adalah data biner yang tidak dapat diidentifikasi secara cukup sebagai format atau teks yang dikenal.
cannot open File tidak dapat dibuka karena jalur tidak ada atau karena izin, dll.

Hasilnya tidak menjamin keandalan atau keamanan file. Mengenali format tertentu tidak membuktikan bahwa file bebas dari kode berbahaya. Pesan cannot open juga dapat disertai status keluar 0 secara default; gunakan -E jika skrip perlu memperlakukan kesalahan sistem file sebagai kegagalan.

Memeriksa tipe MIME dan encoding karakter

MIME (Multipurpose Internet Mail Extensions) menggunakan pengenal seperti image/png atau text/html untuk menyatakan jenis media. Encoding menjelaskan bagaimana karakter direpresentasikan sebagai byte; keduanya adalah informasi yang berbeda.

Lihat tipe MIME dan pengkodean bersama dengan -i

-i atau --mime menampilkan tipe MIME dan pengkodean karakter alih-alih deskripsi panjang yang mudah dibaca manusia.

file -i index.html
file --mime README.md

File teks dapat menampilkan tipe MIME bersama dengan charset sebagai berikut.

index.html: text/html; charset=utf-8

Contoh tersebut sesuai untuk HTML yang mengandung karakter non-ASCII UTF-8. Jika seluruh isinya ASCII, hasil dapat berupa charset=us-ascii; ASCII juga merupakan bagian dari UTF-8 yang valid. Untuk data nonteks, charset=binary bukan nama encoding teks yang perlu diterapkan ke file.

Hanya keluarkan tipe atau pengkodean

--mime-type hanya menampilkan tipe MIME, dan --mime-encoding hanya menampilkan informasi pengkodean.

file --mime-type image.webp
file --mime-encoding README.md

Gunakan -b bersama jika Anda hanya memerlukan nilai tanpa nama file.

file -b --mime-type image.webp
file -b --mime-encoding README.md

Ini dapat dirujuk dalam pengaturan server web atau pemeriksaan unggahan, tetapi Anda tidak boleh menilai sebuah file aman hanya berdasarkan nilai MIME yang dikirim oleh klien atau hasil file.

Menyesuaikan nama file dan spasi dalam output

Menampilkan deskripsi saja dengan -b

Output default dalam format filename: description. -b atau --brief menghilangkan awalan nama file.

file -b archive.tar.gz
file -b --mime-type photo.jpg

Ini berguna saat hanya menyimpan hasil di variabel skrip.

Menyempurnakan output beberapa file dengan -N dan -F

Saat memeriksa beberapa file, nama file dapat disejajarkan dengan lebar yang sama. -N menghapus padding ini, dan -F mengubah pemisah antara nama file dan hasil.

file -N file1 file-with-long-name.bin
file -F ' => ' file1 file2

-N hanya menghapus spasi perataan, bukan mengurutkan nama. Jika nama dapat mengandung pemisah atau baris baru, jangan langsung memecah keluaran berdasarkan titik dua atau baris. -0 sekali menambahkan byte NUL setelah nama, tetapi pemisah dan baris baru masih ada. Pada implementasi yang mendukungnya, -00 menghasilkan pasangan nama dan deskripsi yang masing-masing diakhiri NUL; program pembacanya juga harus memahami format itu.

Memeriksa tautan simbolik

Memeriksa tautan itu sendiri

Jika POSIXLY_CORRECT tidak disetel, default implementasi upstream adalah melaporkan tautan beserta jalur targetnya, tanpa memeriksa isi target. Gunakan -h atau --no-dereference untuk meminta perilaku ini secara eksplisit.

file -h current.log

Jika POSIXLY_CORRECT disetel, default beralih menjadi mengikuti tautan. Karena itu, tentukan -h atau -L dalam skrip agar hasil tidak bergantung pada lingkungan.

Memeriksa target tautan dengan -L

-L atau --dereference mengikuti tautan simbolik untuk memeriksa tipe file target yang sebenarnya.

file -L current.log
file --dereference latest-image

Tautan yang rusak tidak dapat membuka file target, sehingga hasil tentang tautan atau kesalahan ditampilkan.

Periksa file terkompresi dan data internal

Periksa format kompresi dalam keadaan default

Jika Anda memeriksa tanpa opsi, umumnya menjelaskan format kompresi luar seperti gzip, xz, bzip2.

file backup.tar.gz
file archive.xz

Gunakan -z untuk mencoba memeriksa format internal

-z atau --uncompress mencoba membaca data setelah dekompresi untuk mengenali format di dalamnya. Perintah ini tidak mengekstrak anggota arsip ke direktori kerja. Hasilnya bergantung pada format, dukungan dekompresi bawaan atau program pendukung yang tersedia, serta batas pembacaan. Mengenali arsip tar di dalam gzip tidak berarti memeriksa setiap anggota arsip.

file -z backup.tar.gz
file --uncompress archive.xz

Proses dekompresi memerlukan waktu dan sumber daya tambahan. File besar dari sumber yang tidak terpercaya atau file yang mungkin merupakan bom kompresi harus ditangani di lingkungan terisolasi dengan kebijakan pembatasan terpisah.

Periksa beberapa file dan daftar file

Tentukan beberapa file dengan glob shell

Anda dapat memeriksa file dengan ekstensi tertentu di direktori saat ini sekaligus.

file *.jpg
file *.sh

Tergantung pada pengaturan shell, string pola dapat diteruskan apa adanya jika tidak ada file yang cocok dengan glob. Jika ada banyak nama file, Anda mungkin melebihi batas panjang baris perintah.

Membaca daftar nama file dengan -f

-f atau --files-from membaca daftar jalur yang ditulis satu per baris untuk pemeriksaan.

file -f files-to-check.txt
file -F ' => ' -f files-to-check.txt

-f memproses daftar segera setelah menemukan opsi, jadi opsi yang memengaruhi keluaran seperti -F harus ditempatkan sebelumnya.

Jalur relatif dalam daftar ditafsirkan dari direktori kerja saat menjalankan perintah, bukan dari lokasi file daftar. Format satu jalur per baris tidak dapat merepresentasikan nama yang mengandung baris baru dengan utuh; untuk nama semacam itu, gunakan pemrosesan argumen seperti contoh find -exec berikut.

Memeriksa input standar dan hasil find

Memeriksa format data dari input standar

Menentukan tanda hubung tunggal - sebagai nama file membaca data dari input standar.

printf '%s\n' 'hello' | file -

Jika nama file secara harfiah adalah -, gunakan file ./-. Penanda -- menghentikan opsi, tetapi tidak mengubah arti argumen - sebagai input standar.

Input standar bisa sulit dibaca lagi, jadi hasilnya mungkin berbeda secara detail dibandingkan dengan memeriksa file yang sebenarnya.

Memeriksa secara rekursif dengan find -exec

Untuk memeriksa file regular secara rekursif termasuk subdirektori, Anda dapat menggabungkannya dengan find.

find ./uploads -type f -exec file -- {} +

{} + mengelompokkan jalur yang ditemukan sebanyak mungkin dan meneruskannya ke file, menangani nama file dengan spasi dengan aman. Jika ada banyak file yang perlu diperiksa, batasi jalur dan kedalamannya.

Menggunakan jenis MIME dalam skrip shell

Simpan contoh lengkap berikut sebagai check-image.sh, lalu jalankan sh check-image.sh './photo.jpg'. Skrip membutuhkan shell yang kompatibel dengan POSIX dan utilitas file yang mendukung -E serta --mime-type. Opsi -E membuat kegagalan membuka file dapat diperiksa sebelum hasil MIME digunakan.

#!/bin/sh
if [ "$#" -ne 1 ]; then
  printf '%s\n' 'Penggunaan: sh check-image.sh PATH' >&2
  exit 2
fi

path=$1
if [ "$path" = '-' ]; then
  path='./-'
fi

if mime_type=$(file -E -b --mime-type -- "$path"); then
  :
else
  printf '%s\n' "Gagal memeriksa file: $path" >&2
  exit 2
fi

case "$mime_type" in
  image/jpeg|image/png|image/webp)
    printf '%s\n' 'Format gambar didukung.'
    ;;
  *)
    printf '%s\n' "Format tidak didukung: $mime_type" >&2
    exit 1
    ;;
esac

Gambar JPEG, PNG, atau WebP yang dikenali menghasilkan pesan dukungan dan status 0; format lain menghasilkan status 1. Argumen yang salah atau kegagalan pemeriksaan menghasilkan status 2. Periksa status dengan echo "$?" segera setelah menjalankan skrip. -- dan kutip pada jalur melindungi nama yang diawali tanda hubung atau mengandung spasi.

Pemeriksaan ini berguna untuk klasifikasi cepat tetapi tidak menggantikan verifikasi keamanan. Saat memproses unggahan nyata, Anda harus menerapkan batas ukuran file, decoder yang aman, jalur penyimpanan terpisah, menghapus izin eksekusi, dan melakukan pemeriksaan malware sesuai kebutuhan.

Ringkasan opsi utama

Opsi Deskripsi
-b, --brief Menghilangkan awalan nama file di output.
-i, --mime Mencetak tipe MIME dan pengkodean karakter.
--mime-type Mencetak hanya tipe MIME.
--mime-encoding Mencetak hanya informasi pengkodean karakter.
-L, --dereference Mengikuti tautan simbolik untuk memeriksa file target.
-h, --no-dereference Memeriksa tautan itu sendiri tanpa mengikuti tautan simbolik.
-z, --uncompress Mencoba memeriksa data setelah dekompresi tanpa mengekstrak anggota arsip ke direktori kerja.
-k, --keep-going Terus memeriksa kecocokan magic lain bahkan setelah kecocokan pertama.
-f file Membaca daftar jalur untuk diperiksa dari file yang ditentukan.
-F string Mengubah pemisah antara nama file dan hasil.
-N, --no-pad Menghapus spasi perataan nama file; tidak mengurutkan hasil.
-p, --preserve-date Berusaha mempertahankan waktu akses file sebelum pemeriksaan pada sistem yang didukung.
-s, --special-files Membaca dan memeriksa file khusus seperti perangkat blok atau karakter. Gunakan hanya jika memahami risiko akses perangkat.
-E Membuat kesalahan sistem file berakhir dengan pesan kesalahan dan status kegagalan alih-alih diperlakukan sebagai hasil normal.
-- Mengakhiri pemrosesan opsi untuk melewatkan nama file yang diawali dengan tanda hubung dengan aman.

Hal yang perlu diperhatikan saat menggunakan hasil file

Hasil penentuan adalah perkiraan

file mengklasifikasikan file berdasarkan pola yang dikenal dan heuristik. File yang rusak, format baru atau jarang, atau file yang menggabungkan beberapa format dapat menghasilkan hasil yang ambigu atau tidak terduga.

Format file berbeda dari keamanan

Meskipun diidentifikasi sebagai gambar atau dokumen, itu tidak berarti tidak ada data berbahaya di dalamnya. Dalam lingkungan yang sensitif terhadap keamanan, rujuk ekstensi, tipe MIME, dan penentuan magic secara bersamaan, serta gunakan parser khusus dan verifikasi berbasis kebijakan.

Berhati-hatilah dengan file khusus dan input yang besar

Membaca file perangkat dengan -s atau memeriksa data yang dikompresi dengan -z bisa lebih berisiko dan mahal dibandingkan pemeriksaan file biasa. Verifikasi sumber dan ukuran target serta jalankan dengan hak istimewa minimal.

FAQ

Apakah perintah file memeriksa ekstensi file?

Pendeteksian utamanya memakai metadata, pola magic dalam isi, dan karakteristik teks, bukan sekadar akhiran nama. Karena itu, format masih dapat diperkirakan saat ekstensi hilang atau tidak sesuai, meskipun hasilnya bukan jaminan mutlak.

Bagaimana cara menampilkan hanya tipe MIME tanpa nama file?

Gunakan file -b --mime-type filename. -b menghilangkan awalan nama file, dan --mime-type hanya memilih tipe MIME.

Bagaimana saya bisa memeriksa tipe file dari target link simbolik?

Gunakan file -L linkname. Untuk memeriksa informasi tentang link itu sendiri, gunakan file -h linkname.

Mengapa hasil file hanya menunjukkan sebagai "data"?

Mungkin karena tidak ada pola yang cocok dengan database magic dan tidak dapat diidentifikasi sebagai teks. File mungkin rusak, terlalu pendek, atau database magic yang terpasang mungkin tidak mengenali format itu.

Dokumentasi resmi

Untuk konteks penggunaan utilitas lain, lihat daftar perintah Linux yang umum digunakan (bahasa Inggris). Rincian opsi dan aturan magic tersedia pada sumber upstream berikut.