Basta usar 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
Como explicado em 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”.
Você também pode usar um truque para executar isso diretamente no nome do executável no seu $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
Para encontrar o tipo de arquivo de todos os executáveis que podem ser encontrados nos diretórios do seu $PATH
, você pode fazer isso:
find $(printf "$PATH" | sed 's/:/ /g') -type f | xargs file
E para executar file
em todos os arquivos em um diretório específico ( /usr/bin
por exemplo), basta
file /usr/bin/*
file
cada arquivo para ver que tipo de arquivo é esse. Existe algum método simples para todos os arquivos?file /usr/bin/*
. Assim como qualquer outro comando.Na verdade, as diferenças entre elas não são tão grandes.
Em um sistema Unix ou Linux típico, há menos de cinco executáveis reais. No Ubuntu, esses são
/lib/ld-linux.so.2
e/sbin/ldconfig
.Todo o resto marcado como executável é executado através de um intérprete , para o qual dois formatos são suportados:
#!
terão o nome do intérprete entre esse e o primeiro caractere de nova linha (isso mesmo, não é necessário que "scripts" sejam arquivos de texto).PT_INTERP
segmento que fornece o caminho para o intérprete (geralmente/lib/ld-linux.so.2
).Quando esse arquivo é executado, o kernel encontra o nome do intérprete e o chama. Isso pode acontecer recursivamente, por exemplo, quando você executa um script de shell:
#! /bin/sh
no início./bin/sh
, encontra oPT_INTERP
segmento apontando para/lib/ld-linux.so.2
./lib/ld-linux.so.2
, descobre que não possui umPT_INTERP
segmento, carrega seu segmento de texto e o inicia, passando o identificador aberto para/bin/sh
e a linha de comando para sua chamada de script.ld-linux.so.2
carrega os segmentos de código/bin/sh
, resolve as referências da biblioteca compartilhada e inicia sua função principal/bin/sh
reabre o arquivo de script e começa a interpretá-lo linha por linha.Do ponto de vista do kernel, a única diferença é que, para o arquivo ELF, o descritor de arquivo aberto é passado em vez do nome do arquivo; isso é principalmente uma otimização. Se o intérprete decide pular para um segmento de código carregado do arquivo ou interpretá-lo linha por linha, é decidido apenas pelo intérprete e, principalmente, com base na convenção.
fonte
O comando File é ótimo, mas para uma ferramenta de análise mais profissional, gostaria que você tentasse o pacote TrID, que é uma ferramenta de identificação de arquivos.
O TrID é um utilitário projetado para identificar os tipos de arquivos a partir de suas assinaturas binárias e é fácil de usar.
Para mais informações e o pacote, visite: Site
fonte