
Ich möchte Dateitypen finden, die aus Sicht des Kernels ausführbar sind. Soweit ich weiß, sind alle ausführbaren Dateien unter Linux ELF-Dateien. Daher habe ich Folgendes versucht:
find * | file | grep ELF
Das funktioniert jedoch nicht. Hat jemand andere Ideen?
Antwort1
Spätere Bearbeitung: Nur dieses hier macht, was Jan braucht: Danke, Huygens;
find . -exec file {} \; | grep -i elf
Antwort2
Alternative Lösung ohne file
und readelf
für Benutzer eingeschränkter (z. B. eingebetteter) Systeme:
find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"' {} \; | grep ^7f454c46
Im Grunde geben wir die ersten vier Bytes aus hexdump
und verwenden sie alsUnterschriftWir können dann alle Dateien vom Typ greppenELFmithilfe seiner Signatur 7f454c46
.
Oder, da 7f
ist dieZeichen löschen, und 45
, 4c
, 46
Bytes sind jeweils E
, L
, F
Zeichen, wir könnten auch verwenden:
find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%1_u" " {}\n"' {} \; | grep ^delELF
In diesem Fall können Sie head
stattdessen auch Folgendes verwenden :hexdump
find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \; | grep ^.ELF
Antwort3
Wie andere möchte auch ich antworten. Meine Antwort basiert find
ebenfalls auf der Verwendung des Dienstprogramms, aber ich habe eine Idee, die sich von anderen Antworten unterscheidet. Sie basiert auf der Tatsache, dass -exec
auch das als Suchkriterium verwendet werden kann. Wenn wir dies berücksichtigen, können wir nun alle vorherigen Vorschläge zu diesem umgestalten:
find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print
D. h. wir haben das grep
in das verschoben -exec
.
Sie fragen sich vielleicht, was uns das bringt? Wir können die Flexibilität von -print
und anderen Dienstprogrammen nutzen find
. Wir können beispielsweise eine Ausgabe nach unserem Geschmack formatieren oder die verwenden -print0
und eine Ausgabe an ein Skript usw. umleiten.
Antwort4
Angenommen, die ursprüngliche Frage bezieht sich aufELFnur Dateien (und keine anderen „ausführbaren Dateien aus Sicht des Kernels“), gibt es eine kürzere und höchstwahrscheinlich schnellere Alternative zu find
+ file
:
$ scanelf -R /SEARCH/PATH
TYPE FILE
ET_DYN /SEARCH/PATH/library.so
ET_EXEC /SEARCH/PATH/app1
ET_EXEC /SEARCH/PATH/app2
Es sucht rekursiv nach ELF-Dateien und druckt für jede Datei den Objektdateityp und den Dateipfad.
Schränken Sie die Suche auf ausschließlich ausführbare ELF-Dateien ein: scanelf -EET_EXEC -R /SEARCH/PATH
.
Banner und Typ unterdrücken, nur Dateipfade behalten: scanelf -EET_EXEC -RBF %F /SEARCH/PATH
.