
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 file
e 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 hexdump
e 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
, 46
bytes são caracteres E
, L
, F
respectivamente, 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 head
em vez de hexdump
neste 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 find
utilitário, mas tenho uma ideia que difere de outras respostas. Baseou-se nesse fato que -exec
també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 grep
para o -exec
.
O que isso nos dá, você pode perguntar? Podemos usar a flexibilidade do -print
e outros do find
utilitário. Por exemplo, podemos formatar uma saída ao nosso gosto ou usar -print0
e 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
.