
커널의 관점에서 실행 가능한 파일 형식을 찾고 싶습니다. 내가 아는 한 Linux의 모든 실행 파일은 ELF 파일입니다. 따라서 나는 다음을 시도했습니다.
find * | file | grep ELF
그러나 그것은 작동하지 않습니다. 다른 생각 있는 사람 있어?
답변1
나중에 편집: jan에게 필요한 작업은 이것만 수행합니다. 감사합니다 huygens;
find . -exec file {} \; | grep -i elf
답변2
제한된(예: 임베디드) 시스템의 경우 file
및 를 사용하지 않는 대체 솔루션 :readelf
find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"' {} \; | grep ^7f454c46
기본적으로 처음 4바이트를 출력 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
.