
Я хочу найти типы файлов, которые являются исполняемыми с точки зрения ядра. Насколько мне известно, все исполняемые файлы в 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
.