Verwenden Sie einfach 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
Wie erklärt in 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”.
Sie können auch einen Trick verwenden, um dies direkt auf den Namen der ausführbaren Datei in Ihrem auszuführen $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
So ermitteln Sie den Dateityp aller ausführbaren Dateien, die sich in Ihren Verzeichnissen $PATH
befinden:
find $(printf "$PATH" | sed 's/:/ /g') -type f | xargs file
Und um file
alle Dateien in einem bestimmten Verzeichnis ( /usr/bin
zum Beispiel) auszuführen , tun Sie dies einfach
file /usr/bin/*
file
für jede Datei ausführen, um zu sehen, um welchen Dateityp es sich handelt. Gibt es eine einfache Methode für alle Dateien?file /usr/bin/*
. Genau wie bei jedem anderen Befehl.Eigentlich sind die Unterschiede zwischen diesen nicht so groß.
Auf einem typischen Unix- oder Linux-System gibt es weniger als fünf echte ausführbare Dateien. Unter Ubuntu sind dies
/lib/ld-linux.so.2
und/sbin/ldconfig
.Alles andere, was als ausführbar markiert ist, wird über einen Interpreter ausgeführt , für den zwei Formate unterstützt werden:
#!
, haben den Interpreternamen zwischen diesem und dem ersten Zeilenumbruchzeichen (das ist richtig, es ist nicht erforderlich, dass "Skripte" Textdateien sind).PT_INTERP
Segment, das (normalerweise/lib/ld-linux.so.2
) den Pfad zum Interpreter angibt .Wenn eine solche Datei ausgeführt wird, findet der Kernel den Namen des Interpreters und ruft ihn stattdessen auf. Dies kann rekursiv geschehen, beispielsweise wenn Sie ein Shell-Skript ausführen:
#! /bin/sh
am Anfang./bin/sh
und findet dasPT_INTERP
Segment, auf das er zeigt/lib/ld-linux.so.2
./lib/ld-linux.so.2
, stellt fest, dass er keinPT_INTERP
Segment hat, lädt sein Textsegment und startet es, indem er das offene Handle an übergibt/bin/sh
und die Befehlszeile für Ihren Skriptaufruf übergibt.ld-linux.so.2
Lädt die Codesegmente aus/bin/sh
, löst gemeinsam genutzte Bibliotheksreferenzen auf und startet die Hauptfunktion/bin/sh
öffnet dann die Skriptdatei erneut und beginnt, sie Zeile für Zeile zu interpretieren.Aus Sicht des Kernels besteht der einzige Unterschied darin, dass für die ELF-Datei der offene Dateideskriptor anstelle des Dateinamens übergeben wird. Dies ist meist eine Optimierung. Ob der Interpreter dann beschließt, zu einem aus der Datei geladenen Codesegment zu springen oder es Zeile für Zeile zu interpretieren, entscheidet nur der Interpreter und basiert hauptsächlich auf Konventionen.
quelle
Der Befehl file ist großartig, aber für ein professionelleres Analysetool möchte ich, dass Sie das TrID-Paket ausprobieren , bei dem es sich um ein Tool zur Dateikennung handelt.
TrID ist ein Dienstprogramm, mit dem Dateitypen anhand ihrer binären Signaturen identifiziert werden können. Es ist einfach zu verwenden.
Weitere Informationen und das Paket finden Sie unter: Site
quelle