Wie finde ich ausführbare Dateitypen?

7

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. Also habe ich folgendes versucht:

find * | file | grep ELF

Das funktioniert jedoch nicht. Hat jemand andere Ideen?

JohnnyFromBF
quelle
@Levon Es zeigt mir die Verwendungshilfe der Datei. Wahrscheinlich kann die Datei die Eingabe von find nicht verarbeiten.
JohnnyFromBF
3
Nur ein kleiner Seitenknoten, mit binfmt_miscIhnen kann beliebige Dateien wie Klassen läuft, exes usw. en.wikipedia.org/wiki/Binfmt_misc
Ulrich Dangel
@UlrichDangel: +1 für die Erwähnung binfmt_misc. Binärformate sind so flexibel wie Dateisysteme unter Linux. Suchen Sie auf jeden Fall ELFs, aber (a) Sie finden nicht alle ausführbaren Dateien, (b) die ELFs, die Sie finden, sind in der Praxis nicht unbedingt ausführbar . Beispielsweise kann ein SPARC64-ELF nicht auf einem x86 ausgeführt werden.
Alexios
Nein. Die a.out-Dateien sind ebenfalls ausführbar, und Dateien, die als ausführbar wie Bashscripts mit entsprechendem Shebang markiert sind.
Benutzer unbekannt
Warum bekomme ich negative Stimmen zu dieser Frage, Idioten bei der Arbeit?
JohnnyFromBF

Antworten:

11

Später bearbeiten: nur dieser macht was jan braucht: danke huygens;

find . -exec file {} \; | grep -i elf

fromnaboo
quelle
find . -exec file {} \; | grep -i elfist das, wonach ich gesucht habe, danke!
JohnnyFromBF
1
Ich denke, dein erster Befehl funktioniert nicht. Es wird nach Dateien mit einem Namen wie "* elf *" gesucht (ohne den Fall zu berücksichtigen). Sie möchten die Ausgabe genau wie im zweiten Vorschlag erfassen.
Huygens
@huygens Ich habe es getestet, bevor ich gepostet habe und es funktioniert. berühre elf selbst 1ELF2 elf2 </ code>; Mein Befehl findet alle elfelbezogenen Dateien.
Fromnaboo
@huygens Ich habe es getestet, bevor ich gepostet habe und es funktioniert. berühre elf selbst 1ELF2 elf2; Mein Befehl findet alle elf-bezogenen Dateien (genau wie der grep). Sie haben diesen Fehler erhalten, weil Sie ihn kopiert haben (glaube ich) und ein Leerzeichen im "" nicht benötigt wird. aber wenn ich "asteriskELFasterisk" in <code> schreibe, frisst der HTML-Code meine Sternchen !!!
Fromnaboo
Wenn Sie dies tun cd /sbin; find . -iname "*elf*" -exec file {} \;, werden keine Dateien gemeldet :) Es werden jedoch cd /sbin; find . -exec file {} \; | grep -i elfmehrere Dateien gemeldet. Daher ist mein Punkt richtig. Mit der Option -iname suchen Sie einfach, ob der Dateiname mit dem Muster übereinstimmt. Wenn eine ausführbare ELF-Datei mkswap heißt, werden Sie sie nicht finden. PS: Ich habe beide versucht , "*elf*"und , *elf *"und wie ich keine Binärdateien in / sbin gefunden werden erwartet , die falsch ist.
Huygens
1

Werfen Sie einen Blick auf die -executableFlagge von find.

ДМИТРИЙ МАЛИКОВ
quelle
3
Das ist nicht ganz das, was ich will, ich möchte keine Dateien, die als ausführbare Dateien gekennzeichnet sind, aber ich möchte ELF-Dateien finden, Dateien, die vom Kernel als ausführbar erkannt werden.
JohnnyFromBF
Die Flag-ausführbaren Übereinstimmungsberechtigungen (also auch Verzeichnisse) finden Sie auf der Manpage:Matches files which are executable and directories which are searchable (in a file name resolution sense).
Huygens
1
@Huygens: Verzeichnisse sind also Dateien (alles ist eine Datei unter Unix), aber um sie auszuschließen, verwenden Sie einfach find -type f -executable.
Benutzer unbekannt
2
@ Ian: Aber Shellscripts können vom Kernel ausgeführt werden. Ausführbares Flag + entsprechender Shebang bedeutet ausführbare Datei. Oder flag + binary-elf oder flag + a.out oder flag + binfmt-patch.
Benutzer unbekannt
1
@Huygens: Nein, Sie können Shell-Skripte mit Exec-Aufrufen ausführen, siehe: en.wikipedia.org/wiki/Shebang_%28Unix%29 . Wenn es einen Schebang gibt, wird nur der Rest des Skripts vom Interpreter ausgeführt. Seit 1980.
Benutzer unbekannt
1

Ich würde zuerst nach regulären Dateien suchen, da die ausführbare Binärdatei zu diesem Dateityp gehört.

Dann würde ich für jede reguläre Datei den MIME-Typ anfordern und wenn er mit application / x-ausführbare Datei übereinstimmt, handelt es sich um eine ausführbare Binärdatei (die mit ausführbaren Linux-Dateien übereinstimmen sollte, Windows 1 beispielsweise mit application / x-dosexec).

find . -type f -print0 | xargs -0 -n 10 file -i | grep "application/x-executable"

Als ich diesen Befehl versuchte, fand ich eine Diskrepanz mit find . -type f -print0 | xargs -0 -n 10 file | grep -w ELF. Es scheint, dass der Befehl filefehlerhaft ist und die ausführbare ELF als gemeinsam genutztes ELF-Objekt erkennt. Obwohl der Befehl theoretisch korrekt ist, ist er in der Praxis unvollständig.

Wir müssen also nach ausführbaren ELF-Dateien und gemeinsam genutzten Objekten suchen, aber alle Dateien mit den Namen * .so und .so ausschließen.

find . -type f ! \( -name "*.so.*" -o -name "*.so" \) -print0 | xargs -0 -n 10 file -i | egrep "application\/x-sharedlib|application\/x-executable"

Es ist wahrscheinlich nicht perfekt, aber das ist ziemlich nah.

Huygens
quelle
Eigentlich ist meine erste Antwort nicht ganz richtig, da einige ausführbare Binärdateien von file -ials application / x-sharedlib und nicht als application / x-ausführbare Datei erkannt werden .
Huygens
Die Binärdateien, die ich von meinem Mac abgetastet habe application/octet-stream; charset=binary, entsprechen sowohl dem Mac fileals auch der fileauf meiner Debian-Box. (Apropos OS X, filees enthält Verwendungen -Ianstelle von -i. Beide akzeptieren --mimejedoch.)
Blacklight Shining
1

Alternative Lösung, die nicht verwendet wird, fileund readelffür Benutzer mit eingeschränkten (z. B. eingebetteten) Systemen:

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46

Grundsätzlich geben wir die ersten vier Bytes mit aus hexdumpund verwenden sie als Signatur . Wir können dann alle Dateien vom Typ ELF anhand ihrer Signatur erfassen 7f454c46.

Oder da 7fist das Löschzeichen , und 45, 4c, 46Bytes E, L, FZeichen bzw. könnten wir auch verwenden:

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%1_u" " {}\n"'  {} \; | grep ^delELF

Sie können auch headanstelle von hexdumpin diesem Fall verwenden:

find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF
Alex Che
quelle
0

Wie andere möchte ich auch antworten. Meine Antwort basiert auch auf der Verwendung des findDienstprogramms, aber ich habe eine Idee, die sich von anderen Antworten unterscheidet. Es beruhte auf dieser Tatsache, dass das -execauch als Suchkriterium verwendet werden kann. In Anbetracht dessen können wir nun alle vorherigen Vorschläge auf diesen umgestalten:

find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print

Dh wir haben die bewegt grepin die -exec.

Was gibt uns das, fragen Sie sich vielleicht? Wir können die Flexibilität des -printund anderer findDienstprogramme nutzen. Zum Beispiel können wir eine Ausgabe nach unserem Geschmack formatieren oder die -print0Ausgabe verwenden und eine Ausgabe an ein Skript usw. umleiten.

Serge Roussak
quelle
0

Ich denke, dies beantwortet die ursprüngliche Frage, ob sie beabsichtigten, ausführbare Binärdateien zu finden, indem sichergestellt wird, dass jede Übereinstimmung einen Elfen-Header hat.

Es verarbeitet Dateien basierend auf dem Typ vorab -executableund führt die Ergebnisse dann über eine separate Shell aus, die aufruft, readelf -lwelche Pipes zu grepen sind, die stillschweigend mit explizit vorhandenen Headern übereinstimmen executable. Alles, was diesen Test besteht, wird printffür die Ausgabe übergeben.

Das pwdBit gibt den vollständigen Pfad aus.

find `pwd` -type f -executable -exec sh -c 'readelf -l "$1" 2>/dev/null | grep -qio 'executable' && printf "$1\n"' -- {} \;
Niemand
quelle
-2
find -type f -exec file {} \; | grep ELF | grep executable | cut -d: -f1
Pablo Saquilán
quelle
Funktioniert nicht auf allen Dateien / Pfaden
Anthon