
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 file
y 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 hexdump
y los usamos comofirma. Luego podemos grep todos los archivos de tipoDUENDEutilizando su firma 7f454c46
.
O, ya que 7f
es elborrar caracter, y 45
, 4c
bytes 46
son E
, L
, F
caracteres 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 head
en lugar de hexdump
en 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 find
utilidad, pero tengo una idea que difiere de otras respuestas. Se basó en ese hecho, que -exec
tambié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 grep
al -exec
.
¿Qué nos aporta esto?, os preguntaréis. Podemos utilizar la flexibilidad del -print
y otras de la find
utilidad. Por ejemplo, podemos formatear una salida a nuestro gusto, o usar -print0
y 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
.