Edição posterior: só este faz o que o jan precisa: obrigado huygens;
find . -exec file {} \; | grep -i elf
Eu quero encontrar tipos de arquivos que sejam executáveis do ponto de vista do kernel. Tanto quanto 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 ideias?
Eu procuraria por arquivos regulares primeiro, pois executáveis binários pertencem a esse tipo de arquivo.
Então eu solicito para cada arquivo regular o tipo mime e se ele corresponder ao aplicativo / x-executável, então é um arquivo executável binário (que deve corresponder aos arquivos executáveis do Linux, um por exemplo match application / x-dosexec).
find . -type f -print0 | xargs -0 -n 10 file -i | grep "application/x-executable"
Tentando esse comando, encontrei uma discrepância com find . -type f -print0 | xargs -0 -n 10 file | grep -w ELF
. Parece que o comando file
está com bugs e detecta o executável ELF como objeto compartilhado ELF. Portanto, mesmo que o comando seja teoricamente correto, na prática ele está incompleto.
Portanto, temos que procurar por executáveis ELF e objetos compartilhados, mas excluir todos os arquivos com o nome * .so e .so.
find . -type f ! \( -name "*.so.*" -o -name "*.so" \) -print0 | xargs -0 -n 10 file -i | egrep "application\/x-sharedlib|application\/x-executable"
Provavelmente não é perfeito, mas é bem perto disso.
Dê uma olhada no -executable
flag de find
.
Solução alternativa que não usa file
e readelf
, para aqueles em sistemas limitados (por exemplo, incorporados):
find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"' {} \; | grep ^7f454c46
Basicamente, geramos os primeiros quatro bytes com hexdump
e os usamos como uma assinatura . Podemos, então, grep todos os arquivos do tipo ELF usando sua assinatura 7f454c46
.
Ou, como 7f
é o excluir caractere e 45
, 4c
, 46
bytes são E
, L
, F
caracteres 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
Como outros, quero responder também. Minha resposta é baseada no uso do utilitário find
também, mas tenho uma ideia, que é diferente de outras respostas. Baseada nesse fato, o -exec
pode ser usado como critério de pesquisa também. 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. movemos o grep
para o -exec
.
O que isso nos dá, você pode perguntar? Podemos usar a flexibilidade do -print
e outros do utilitário find
. Por exemplo, podemos formatar uma saída em nosso gosto ou usar o -print0
e redirecionar uma saída para algum script, etc.
Acho que isso responde à pergunta original se a intenção deles era encontrar arquivos executáveis binários garantindo que cada correspondência tenha um cabeçalho de elf.
Ele classifica os arquivos com base no tipo -executable
e, em seguida, executa os resultados por meio de um shell separado que chama readelf -l
, que canaliza para o grep e corresponde silenciosamente aos cabeçalhos que são explicitamente executable
. Qualquer coisa que passar nesse teste é passada para printf
da saída.
O bit pwd
exibe o caminho completo.
find 'pwd' -type f -executable -exec sh -c 'readelf -l "$1" 2>/dev/null | grep -qio 'executable' && printf "$1\n"' -- {} \;
find -type f -exec file {} \; | grep ELF | grep executable | cut -d: -f1
Tags bash find files executable elf