Suche nach einem bestimmten magischen Byte in einem Meer von Dateien

Suche nach einem bestimmten magischen Byte in einem Meer von Dateien

Ich möchte wissen, wie ich nach einem bestimmten Dateityp suchen kann: Ich habe einen SSH-Server aufgerufen und versuche, nach einer .jpgDatei zu suchen, aber der Besitzer des Servers (mein Lehrer) hat alle Erweiterungen entfernt.

Ich habe es versucht grep -lr "JFIF"und viele Verzeichnisse mit demselben Dateinamen gefunden. Also bin ich in ein zufälliges Verzeichnis gesprungen, das mit dem Befehl gefunden wurde , und habe versucht, den Befehl darauf grepanzuwenden , aber das Terminal konnte nicht die gesamte Binärdatei anzeigen.cat

Außerdem stringswird der Befehl auf dem SSH-Server blockiert. Mein Lehrer sagte, dass ich eine JPG-Datei finden muss und dass diese Datei eine Seriennummer (SN) enthält, aber ich habe keine Ahnung, wo ich sie finden kann.

Wenn ihr die SSH-Kardinalsnummern wollt, gebe ich sie euch gerne. Mein Lehrer hat jedenfalls gesagt, dass ihr filedafür den Befehl verwenden könnt, aber ich weiß nicht, wie das geht.

Übrigens: er sagte (SN)

Antwort1

Ich werde versuchen, Ihnen einige Hinweise zu geben, damit Sie Ihre Hausaufgaben selbst lösen können.

Befolgen Sie diese Schritte:

  1. Lesen Sie das Handbuch, fileindem Sie ausführen man file.
  2. Dann probiere es aus file somefileund schau, was passiert
  3. fileVersuchen Sie , mit verschiedenen Dateitypen zu arbeiten
  4. Jetzt sollten Sie wissen, wie Sie herausfinden, ob es sich bei einer Datei um ein JPEG-Bild handelt oder nicht.
  5. Lesen Sie jetzt das Handbuch find(oder verwenden Sie Google, um herauszufinden, wie Sie damit alle Dateien in einem bestimmten Verzeichnis und allen Unterverzeichnissen finden können).
  6. Jetzt erfahren Sie, wie Sie -execdie Option verwenden, findum sie mit dem zuvor verwendeten fileBefehl zu verbinden
  7. Jetzt sollten Sie in der Lage sein, die Dateitypen aller Dateien im benötigten Verzeichnis herauszufinden und aufzulisten
  8. Lesen Sie jetzt über Pipes |und grepBefehle, um herauszufinden, wie Sie nur nach JPEG-Dateien filtern.

Antwort2

Zunächst möchte ich @incBrain und @Serg dafür danken, dass sie meine Frage nicht direkt beantwortet haben, was mir geholfen hat, viele neue Dinge zu verstehen :).

Meine Aufgabe war es, eine bestimmte .jpgDatei zu finden, deren Erweiterung entfernt wurde. Das erste, woran ich dachte, ist.jpg magisches ByteDas war JFIF, und mit @incBrain Anweisungen konnte ich diesen Befehl erstellen

find / -exec file {} \; | grep "JFIF"

Diese Zeile verknüpft findBefehl mit fileBefehl, -execruft dann die Ausgabe beider find& file-Befehle ab und überträgt sie als Eingabe über das Pipe-Symbol |für den grepBefehl, wodurch nur die Dateien angezeigt werden, die JFIFin ihrer Binärdatei, auch bekannt als , enthalten sind .jpg files.

Mein Problem war eigentlich, eine bestimmte Seriennummer zu finden. Zuerst dachte ich, dass die Seriennummer in der Binärdatei der Datei enthalten ist, aber das war falsch, dann kam mir ein verrückter Gedanke

Oh! Warum kann ich nicht sehen, wie das Bild aussieht? Ich meine, wenn ich die Seriennummer nicht finden kann, wäre es gut, das Bild zu bekommen

und ich habe im Internet nach einer guten Möglichkeit gesucht, Dateien per SSH auf meinen Computer zu übertragen, und ich habe diesen Codeblock gefunden, der funktioniert hat!

scp [email protected]:/home/example/file.txt /Local_Directory

Ich hoffe, dass diese Antwort in Zukunft jemandem hilft :).

Antwort3

Eine mögliche Lösung könnte diese sein: Verwenden Sie , findwodurch reguläre Dateien rekursiv aufgelistet werden ( -type f) und filefür jede einzelne davon ein Befehl ausgeführt wird. Leiten Sie die Ausgabe um, um grepDateitypen herauszufiltern.

Hier möchte ich jedoch etwas Lustigeres machen; etwas Unbeholfeneres, aber Lustigeres.

$ find .  -maxdepth 1 -type f -printf "%f\t" -exec hexdump -n8 {} \;  | awk '/d8ff e0ff 1000 464a/{print $1}'

Wie Sie vielleicht wissen oder auch nicht, weisen die ersten 8 Bytes jeder Datei den Dateityp auf. Daher findsuchen wir mit nach allen regulären Dateien, drucken ihren Namen, führen dann aber Hexdump aus, um die ersten 8 Bytes zu extrahieren und filtern awknur die Dateinamen heraus, die diese ersten 8 Bytes aufweisen.

Hier ist ein kleiner Beweis:

$ hexdump -n 10 1450763029649.jpg               
0000000 d8ff e0ff 1000 464a 4649               
000000a

$ hexdump  -C -n 10 1450763029649.jpg           
00000000  ff d8 ff e0 00 10 4a 46  49 46                    |......JFIF|
0000000a

Antwort4

file * | grep -i "jpeg"

Dadurch wird jede Datei im Verzeichnis durchsucht und ihr Dateityp zurückgegeben. Über die Pipe |werden diese Ergebnisse dann von grep durchsucht, um die Datei mit dem Dateityp „jpeg“ oder im Grunde eine .jpg-Datei zu finden.

verwandte Informationen