Как найти типы исполняемых файлов?

Как найти типы исполняемых файлов?

Я хочу найти типы файлов, которые являются исполняемыми с точки зрения ядра. Насколько мне известно, все исполняемые файлы в Linux — это файлы ELF. Поэтому я попробовал следующее:

find * | file | grep ELF

Однако это не работает. Есть ли у кого-нибудь другие идеи?

решение1

Последующее редактирование: только этот делает то, что нужно Яну: спасибо, Гюйгенс;

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

решение2

Альтернативное решение без использования fileи readelfдля тех, кто работает на ограниченных (например, встроенных) системах:

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

По сути, мы выводим первые четыре байта hexdumpи используем их какподпись. Затем мы можем выполнить grep всех файлов типаЭЛЬФиспользуя свою подпись 7f454c46.

Или, поскольку 7fэтоудалить символ, и 45, 4c, 46байты — это E, L, Fсимволы соответственно, мы также могли бы использовать:

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

Также вы можете использовать headвместо hexdumpв этом случае:

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

решение3

Как и другие, я тоже хочу ответить. Мой ответ основан на использовании утилиты find, но у меня есть идея, которая отличается от других ответов. Она основана на том факте, что -execможет использоваться как критерий поиска. Теперь, имея это в виду, мы можем переделать все предыдущие предложения в это:

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

Т.е. мы переместили grepв -exec.

Что это нам дает, спросите вы? Мы можем использовать гибкость -printи других утилит find. Например, мы можем форматировать вывод по своему вкусу или использовать -print0и перенаправлять вывод в какой-то скрипт и т. д.

решение4

Предполагая, что исходный вопрос относится кЭЛЬФтолько файлы (а не любые другие «исполняемые с точки зрения ядра»), существует более короткая и, скорее всего, более быстрая альтернатива find+ file:

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

Он рекурсивно ищет ELF-файлы, выводит тип объектного файла и путь к файлу для каждого из них.

Сузьте поиск только до исполняемых файлов ELF: scanelf -EET_EXEC -R /SEARCH/PATH.

Подавить баннер и тип, оставив только пути к файлам: scanelf -EET_EXEC -RBF %F /SEARCH/PATH.

Связанный контент