Como encontrar tipos de arquivos executáveis?

Como encontrar tipos de arquivos executáveis?

Quero encontrar tipos de arquivos que sejam executáveis ​​do ponto de vista do kernel. Pelo que eu sei, todos os arquivos executáveis ​​no Linux são arquivos ELF. Assim tentei o seguinte:

find * | file | grep ELF

No entanto, isso não funciona; alguém tem outras idéias?

Responder1

Edição posterior: somente este faz o que jan precisa: obrigado huygens;

find . -exec file {} \; | grep -i elf

Responder2

Solução alternativa que não usa filee readelf, para sistemas limitados (por exemplo, incorporados):

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46

Basicamente, produzimos os primeiros quatro bytes hexdumpe os usamos comoassinatura. Podemos então usar grep em todos os arquivos do tipoDUENDEusando sua assinatura 7f454c46.

Ou, já que 7fé oexcluir caractere, e 45, 4c, 46bytes são caracteres E, L, Frespectivamente, também poderíamos usar:

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%1_u" " {}\n"'  {} \; | grep ^delELF

Além disso, você pode usar headem vez de hexdumpneste caso:

find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF

Responder3

Como outros, também quero responder. Minha resposta também se baseia no uso do findutilitário, mas tenho uma ideia que difere de outras respostas. Baseou-se nesse fato que -exectambém pode ser usado como critério de pesquisa. Agora, tendo isso em mente, podemos refatorar todas as propostas anteriores para esta:

find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print

Ou seja, mudamos o greppara o -exec.

O que isso nos dá, você pode perguntar? Podemos usar a flexibilidade do -printe outros do findutilitário. Por exemplo, podemos formatar uma saída ao nosso gosto ou usar -print0e redirecionar uma saída para algum script, etc.

Responder4

Supondo que a pergunta original se refira aDUENDEapenas arquivos (e não qualquer outro "executável do ponto de vista do kernel"), existe uma alternativa mais curta e, provavelmente, mais rápida para find+ file:

$ scanelf -R /SEARCH/PATH
 TYPE   FILE 
ET_DYN /SEARCH/PATH/library.so
ET_EXEC /SEARCH/PATH/app1
ET_EXEC /SEARCH/PATH/app2

Ele procura recursivamente por arquivos ELF, imprime o tipo de arquivo do objeto e o caminho do arquivo para cada um.

Restrinja a pesquisa apenas a arquivos ELF executáveis: scanelf -EET_EXEC -R /SEARCH/PATH.

Suprima o banner e digite, mantendo apenas os caminhos dos arquivos: scanelf -EET_EXEC -RBF %F /SEARCH/PATH.

informação relacionada