Bagaimana menemukan perbedaan antara file skrip dan file biner?

11
$ ls -l /usr/bin
total 200732

-rwxr-xr-x 1 root   root     156344 Oct  4  2013 adb
-rwxr-xr-x 1 root   root       6123 Oct  8  2013 add-apt-repository
 list goes long ---------

Di atas adbadalah file biner dan file add-apt-repositoryskrip. Saya mendapatkan informasi ini dengan melihat file melalui nautilus. Tetapi melalui baris perintah, saya tidak menemukan perbedaan. Saya tidak dapat memprediksi apakah file itu file biner atau file skrip.

Jadi bagaimana cara membedakan antara file skrip dan file biner melalui baris perintah?

Avinash Raj
sumber

Jawaban:

16

Cukup gunakan file:

$ file /usr/bin/add-apt-repository
/usr/bin/add-apt-repository: Python script, ASCII text executable
$ file /usr/bin/ab
/usr/bin/ab: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=569314a9c4458e72e4ac66cb043e9a1fdf0b55b7, stripped

Sebagaimana dijelaskan dalam man file:

NAME
   file — determine file type

DESCRIPTION
 This manual page documents version 5.14 of the file command.

 file tests each argument in an attempt to classify it.  There are three
 sets of tests, performed in this order: filesystem tests, magic tests,
 and language tests.  The first test that succeeds causes the file type to
 be printed.

 The type printed will usually contain one of the words text (the file
 contains only printing characters and a few common control characters and
 is probably safe to read on an ASCII terminal), executable (the file con‐
 tains the result of compiling a program in a form understandable to some
 UNIX kernel or another), or data meaning anything else (data is usually
 “binary” or non-printable).  Exceptions are well-known file formats (core
 files, tar archives) that are known to contain binary data.  When adding
 local definitions to /etc/magic, make sure to preserve these keywords.
 Users depend on knowing that all the readable files in a directory have
 the word “text” printed.  Don't do as Berkeley did and change “shell
 commands text” to “shell script”.

Anda juga dapat menggunakan trik untuk menjalankan ini langsung atas nama yang dapat dieksekusi di $PATH:

$ file $(type -p add-apt-repository | awk '{print $NF}')
/usr/local/bin/add-apt-repository: Python script, ASCII text executable
$ file $(type -p ab | awk '{print $NF}')
/usr/bin/ab: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=569314a9c4458e72e4ac66cb043e9a1fdf0b55b7, stripped

Untuk menemukan tipe file dari semua executable yang dapat ditemukan di direktori Anda $PATH, Anda dapat melakukan ini:

find $(printf "$PATH" | sed 's/:/ /g') -type f | xargs file

Dan untuk menjalankan filesemua file dalam direktori tertentu ( /usr/bin, misalnya), lakukan saja

file /usr/bin/*
terdon
sumber
Tetapi kita harus menjalankan fileuntuk setiap file untuk melihat jenis file apa ini. Apakah ada metode sederhana untuk semua file?
Avinash Raj
3
@AvinashRaj untuk semua file dalam direktori yang diberikan? Lakukan saja file /usr/bin/*. Sama seperti perintah lainnya.
terdon
5

Sebenarnya, perbedaan di antara keduanya tidak terlalu bagus.

Pada sistem Unix atau Linux yang khas, ada kurang dari lima executable nyata. Di Ubuntu, ini adalah /lib/ld-linux.so.2dan /sbin/ldconfig.

Segala sesuatu yang ditandai dapat dieksekusi dijalankan melalui interpreter , yang didukung dua format:

  1. File yang dimulai dengan #!akan memiliki nama juru bahasa antara ini dan karakter baris baru pertama (itu benar, tidak ada persyaratan bahwa "skrip" menjadi file teks).
  2. File ELF memiliki PT_INTERPsegmen yang memberikan jalur ke penerjemah (biasanya /lib/ld-linux.so.2).

Ketika file seperti itu dieksekusi, kernel menemukan nama juru bahasa, dan memanggilnya sebagai gantinya. Ini bisa terjadi secara rekursif, misalnya ketika Anda menjalankan skrip shell:

  1. Kernel membuka skrip, menemukan #! /bin/shdi awal.
  2. Kernel terbuka /bin/sh, menemukan PT_INTERPsegmen menunjuk ke /lib/ld-linux.so.2.
  3. Kernel terbuka /lib/ld-linux.so.2, menemukan bahwa ia tidak memiliki PT_INTERPsegmen, memuat segmen teksnya dan memulainya, melewati pegangan terbuka ke /bin/shdan baris perintah untuk permintaan skrip Anda.
  4. ld-linux.so.2memuat segmen kode dari /bin/sh, menyelesaikan referensi pustaka bersama dan memulai fungsi utamanya
  5. /bin/sh kemudian buka kembali file skrip, dan mulai menafsirkannya baris demi baris.

Dari sudut pandang kernel, satu-satunya perbedaan adalah bahwa untuk file ELF, deskriptor file terbuka dilewatkan daripada nama file; ini sebagian besar merupakan optimasi. Apakah penerjemah kemudian memutuskan untuk melompat ke segmen kode yang dimuat dari file, atau menafsirkannya baris demi baris hanya diputuskan oleh penerjemah, dan sebagian besar didasarkan pada konvensi.

Simon Richter
sumber
Informasi bagus, tetapi sebenarnya bukan jawaban untuk pertanyaan ini.
OrangeDog
Jawabannya adalah Mu .
Simon Richter
1

Perintah file sangat bagus, tetapi untuk alat analisis yang lebih profesional, saya ingin Anda mencoba paket TrID yang merupakan alat Pengidentifikasi File.

TrID adalah utilitas yang dirancang untuk mengidentifikasi jenis file dari tanda tangan binernya, dan mudah digunakan.

Untuk informasi lebih lanjut dan paket hanya kunjungi: Situs

nux
sumber