실행 파일 형식을 찾는 방법은 무엇입니까?

실행 파일 형식을 찾는 방법은 무엇입니까?

커널의 관점에서 실행 가능한 파일 형식을 찾고 싶습니다. 내가 아는 한 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.

관련 정보