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

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

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

11
задан 18 April 2014 в 22:40

3 ответа

Просто используйте 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/*
16
ответ дан 16 November 2019 в 14:51

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

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

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

  1. Файлы, запускающиеся с #! будет иметь название интерпретатора между этим и первым символом новой строки (правильно, нет никакого требования что "сценарии" быть текстовыми файлами).
  2. Файлы ELF имеют a 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, находит, что это не имеет a PT_INTERP сегмент, загружает свой сегмент текста и запускает его, передавая открытый дескриптор /bin/sh и командная строка для Вашего вызова сценария.
  4. ld-linux.so.2 загружает сегменты кода из /bin/sh, твердость совместно использовала справочные руководства по библиотеке и запускает его основную функцию
  5. /bin/sh затем вновь открыл файл сценария и начинает интерпретировать его линию за линией.

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

5
ответ дан 16 November 2019 в 14:51

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

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

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

1
ответ дан 16 November 2019 в 14:51

Другие вопросы по тегам:

Похожие вопросы: