Как найти разницу между файлом сценария и двоичным файлом?

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 ---------

Выше adbприведен двоичный файл и файл add-apt-repositoryсценария. Я получаю эту информацию, просматривая файлы через nautilus. Но через командную строку я не обнаружил различий. Я не могу предсказать, является ли файл двоичным файлом или файл сценария.

Итак, как мне различать сценарий и двоичные файлы через командную строку?

Авинаш Радж
источник

Ответы:

16

Просто используйте 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

Как объяснено в 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”.

Вы также можете использовать трюк, чтобы запустить это непосредственно от имени исполняемого файла в вашем $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

Чтобы найти тип файла всех исполняемых файлов, которые можно найти в ваших каталогах $PATH, вы можете сделать это:

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

И чтобы запустить fileвсе файлы в определенном каталоге ( /usr/binнапример), просто выполните

file /usr/bin/*
terdon
источник
Но мы должны запустить fileдля каждого файла, чтобы увидеть, какой это тип файла. Есть ли какой-нибудь простой метод для всех файлов?
Авинаш Радж
3
@AvinashRaj для всех файлов в данном каталоге? Просто делай file /usr/bin/*. Как и любая другая команда.
Terdon
5

На самом деле, различия между ними не так велики.

В типичной системе Unix или Linux существует менее пяти реальных исполняемых файлов. На Ubuntu такие есть /lib/ld-linux.so.2и /sbin/ldconfig.

Все остальное, что помечено как исполняемое, запускается через интерпретатор , для которого поддерживаются два формата:

  1. Файлы, начинающиеся с, #!будут иметь имя интерпретатора между этим и первым символом новой строки (это верно, нет требования, чтобы «сценарии» были текстовыми файлами).
  2. ELF-файлы имеют PT_INTERPсегмент, который дает путь к интерпретатору (обычно /lib/ld-linux.so.2).

Когда такой файл выполняется, ядро ​​находит имя интерпретатора и вместо этого вызывает его. Это может произойти рекурсивно, например, когда вы запускаете скрипт оболочки:

  1. Ядро открывает скрипт, находит #! /bin/shв начале.
  2. Ядро открывается /bin/sh, находит PT_INTERPсегмент, указывающий на /lib/ld-linux.so.2.
  3. Ядро открывается /lib/ld-linux.so.2, обнаруживает, что у него нет PT_INTERPсегмента, загружает свой текстовый сегмент и запускает его, передавая дескриптор open /bin/shи командную строку для вызова вашего скрипта.
  4. ld-linux.so.2загружает сегменты кода /bin/sh, разрешает ссылки на общую библиотеку и запускает ее основную функцию
  5. /bin/sh затем снова открывает файл сценария и начинает интерпретировать его построчно.

С точки зрения ядра, единственное отличие состоит в том, что для файла ELF передается дескриптор открытого файла, а не имя файла; это в основном оптимизация. Решает ли интерпретатор затем перейти к сегменту кода, загруженному из файла, или интерпретировать его построчно, решает только интерпретатор, и в основном это основано на соглашении.

Саймон Рихтер
источник
Хорошая информация, но не совсем ответ на этот вопрос.
OrangeDog
Ответ - Му .
Саймон Рихтер
1

Файловая команда хороша , но для более профессионального инструмента анализа, я хотел бы, чтобы вы попробовали пакет TrID, который является инструментом Идентификатора файла.

TrID - это утилита, разработанная для идентификации типов файлов по их двоичным сигнатурам, и она проста в использовании.

Для получения дополнительной информации и пакета просто посетите: сайт

Nux
источник