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