$ 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
файл сценария. Я получаю эту информацию путем просмотра файлов через наутилус. Но через командную строку, я не нашел различий. Я не могу предсказать, является ли файл двоичным файлом или файлом сценария.
Таким образом, как я дифференцируюсь между сценарием и двоичными файлами через командную строку?
Просто используйте 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/*
На самом деле различия между теми не являются настолько большими.
В типичной системе Unix или Linux существует меньше чем пять реальных исполняемых файлов. На Ubuntu это /lib/ld-linux.so.2
и /sbin/ldconfig
.
Все остальное, что отмечено исполняемый файл, выполняется через интерпретатор, для которого поддерживаются два формата:
#!
будет иметь название интерпретатора между этим и первым символом новой строки (правильно, нет никакого требования что "сценарии" быть текстовыми файлами).PT_INTERP
сегмент, который дает путь к интерпретатору (обычно /lib/ld-linux.so.2
).Когда такой файл выполняется, ядро находит название интерпретатора и называет его вместо этого. Это может произойти рекурсивно, например, при выполнении сценария оболочки:
#! /bin/sh
вначале./bin/sh
, находит PT_INTERP
сегмент, указывающий /lib/ld-linux.so.2
./lib/ld-linux.so.2
, находит, что это не имеет a PT_INTERP
сегмент, загружает свой сегмент текста и запускает его, передавая открытый дескриптор /bin/sh
и командная строка для Вашего вызова сценария.ld-linux.so.2
загружает сегменты кода из /bin/sh
, твердость совместно использовала справочные руководства по библиотеке и запускает его основную функцию/bin/sh
затем вновь открыл файл сценария и начинает интерпретировать его линию за линией.С точки зрения ядра единственная разница - то, что для файла ELF, открытый дескриптор файла передается, а не название файла; это - главным образом оптимизация. Решает ли интерпретатор затем перейти к сегменту кода, загруженному из файла, или интерпретировать он линию за линией только решен интерпретатором, и главным образом на основе конвенции.
команда File является большой, но для более профессионального инструмента анализа, я хотел бы, чтобы Вы попробовали пакет TrID , который является инструментом File Identifier.
TrID является утилитой, разработанной для идентификации типов файлов от их двоичных подписей и его простого в использовании.
Для получения дополнительной информации и пакет просто посетите: Сайт