¿Cómo encontrar tipos de archivos ejecutables?

¿Cómo encontrar tipos de archivos ejecutables?

Quiero encontrar tipos de archivos que sean ejecutables desde el punto de vista del kernel. Hasta donde yo sé, todos los archivos ejecutables en Linux son archivos ELF. Así que intenté lo siguiente:

find * | file | grep ELF

Sin embargo, eso no funciona; ¿Alguien tiene otras ideas?

Respuesta1

Edición posterior: solo este hace lo que Jan necesita: gracias huygens;

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

Respuesta2

Solución alternativa que no utiliza filey readelf, para aquellos en sistemas limitados (por ejemplo, integrados):

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

Básicamente, generamos los primeros cuatro bytes hexdumpy los usamos comofirma. Luego podemos grep todos los archivos de tipoDUENDEutilizando su firma 7f454c46.

O, ya que 7fes elborrar caracter, y 45, 4cbytes 46son E, L, Fcaracteres respectivamente, también podríamos usar:

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

Además, puedes usar headen lugar de hexdumpen este caso:

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

Respuesta3

Como otros, yo también quiero responder. Mi respuesta también se basa en el uso de la findutilidad, pero tengo una idea que difiere de otras respuestas. Se basó en ese hecho, que -exectambién se puede utilizar como criterio de búsqueda. Ahora, teniendo esto en mente, podemos refactorizar todas las propuestas anteriores a esta:

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

Es decir, hemos movido el grepal -exec.

¿Qué nos aporta esto?, os preguntaréis. Podemos utilizar la flexibilidad del -printy otras de la findutilidad. Por ejemplo, podemos formatear una salida a nuestro gusto, o usar -print0y redirigir una salida a algún script, etc.

Respuesta4

Suponiendo que la pregunta original se refiere aDUENDESólo archivos (y no cualquier otro "ejecutable desde el punto de vista del kernel"), existe una alternativa más corta y, probablemente, más rápida a find+ file:

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

Busca recursivamente archivos ELF, imprime el tipo de archivo objeto y la ruta del archivo para cada uno.

Limite la búsqueda a solo archivos ELF ejecutables: scanelf -EET_EXEC -R /SEARCH/PATH.

Suprime el banner y escribe, manteniendo solo las rutas de archivo: scanelf -EET_EXEC -RBF %F /SEARCH/PATH.

información relacionada