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?
binfmt_misc
Ihnen kann beliebige Dateien wie Klassen läuft, exes usw. en.wikipedia.org/wiki/Binfmt_miscbinfmt_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.Antworten:
Später bearbeiten: nur dieser macht was jan braucht: danke huygens;
find . -exec file {} \; | grep -i elf
quelle
find . -exec file {} \; | grep -i elf
ist das, wonach ich gesucht habe, danke!cd /sbin; find . -iname "*elf*" -exec file {} \;
, werden keine Dateien gemeldet :) Es werden jedochcd /sbin; find . -exec file {} \; | grep -i elf
mehrere 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.Werfen Sie einen Blick auf die
-executable
Flagge vonfind
.quelle
Matches files which are executable and directories which are searchable (in a file name resolution sense).
find -type f -executable
.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).
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 Befehlfile
fehlerhaft 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.
Es ist wahrscheinlich nicht perfekt, aber das ist ziemlich nah.
quelle
file -i
als application / x-sharedlib und nicht als application / x-ausführbare Datei erkannt werden .application/octet-stream; charset=binary
, entsprechen sowohl dem Macfile
als auch derfile
auf meiner Debian-Box. (Apropos OS X,file
es enthält Verwendungen-I
anstelle von-i
. Beide akzeptieren--mime
jedoch.)Alternative Lösung, die nicht verwendet wird,
file
undreadelf
für Benutzer mit eingeschränkten (z. B. eingebetteten) Systemen:Grundsätzlich geben wir die ersten vier Bytes mit aus
hexdump
und verwenden sie als Signatur . Wir können dann alle Dateien vom Typ ELF anhand ihrer Signatur erfassen7f454c46
.Oder da
7f
ist das Löschzeichen , und45
,4c
,46
BytesE
,L
,F
Zeichen bzw. könnten wir auch verwenden:Sie können auch
head
anstelle vonhexdump
in diesem Fall verwenden:quelle
Wie andere möchte ich auch antworten. Meine Antwort basiert auch auf der Verwendung des
find
Dienstprogramms, aber ich habe eine Idee, die sich von anderen Antworten unterscheidet. Es beruhte auf dieser Tatsache, dass das-exec
auch als Suchkriterium verwendet werden kann. In Anbetracht dessen können wir nun alle vorherigen Vorschläge auf diesen umgestalten:Dh wir haben die bewegt
grep
in die-exec
.Was gibt uns das, fragen Sie sich vielleicht? Wir können die Flexibilität des
-print
und andererfind
Dienstprogramme nutzen. Zum Beispiel können wir eine Ausgabe nach unserem Geschmack formatieren oder die-print0
Ausgabe verwenden und eine Ausgabe an ein Skript usw. umleiten.quelle
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
-executable
und führt die Ergebnisse dann über eine separate Shell aus, die aufruft,readelf -l
welche Pipes zu grepen sind, die stillschweigend mit explizit vorhandenen Headern übereinstimmenexecutable
. Alles, was diesen Test besteht, wirdprintf
für die Ausgabe übergeben.Das
pwd
Bit gibt den vollständigen Pfad aus.quelle
quelle