Was bedeutet "Zaubertests" für den Dateibefehl?

20

Ich habe über den fileBefehl gelesen und bin auf etwas gestoßen, das ich nicht ganz verstehe:

file bestimmt, welche Art von Datei abgefragt wird. file führt dazu drei Testreihen für die betreffende Datei durch:

  • Dateisystem-Tests,
  • magische tests,
  • Sprachtests

Was sind Zaubertests ?

Abdennour TOUMI
quelle

Antworten:

15

Das bezieht sich auf die "magischen Bytes", die viele Dateiformate am Anfang einer Datei haben und die anzeigen, um welche Art von Datei es sich handelt.

Beginnt eine Datei beispielsweise mit, #!wird sie als Skript betrachtet.

Hauke ​​Laging
quelle
28

"magic" bezieht sich hier auf " magic numbers ": ein spezieller Wert, der sich an einer bekannten Stelle in einer Datei befindet, die seinen Typ identifiziert. Der fileBefehl verfügt über eine Datenbank mit diesen Nummern und dem Typ, dem sie entsprechen. Die Bibliothek, die zu dieser Datenbank gehört, heißt libmagic , und Sie können von Ihren eigenen Programmen aus darauf zugreifen.

Sie sind nicht unbedingt "Zahlen", wie wir sie uns vorstellen könnten. Beispielsweise beginnt eine PNG-Bilddatei immer mit "\ x89PNG \ r \ n \ x1a \ n", eine Java-Klasse beginnt mit den vier Bytes (in hexadezimaler Schreibweise) CA FE BA BE, und eine HTML-Datei enthält irgendwo "<html" in der Nähe des Starts. Es ist nur eine kleine Datensequenz, von der bekannt ist, dass sie sich in einer Datei dieses Typs befindet, normalerweise sehr nah am Anfang.

Wenn Leute Dateiformate definieren, nehmen sie oft eines davon absichtlich oder nur als Teil der Anpassung des Formats auf. filekann sie danach verwenden. Es gibt auch andere Möglichkeiten, den Inhalt der Datei tatsächlich zu betrachten, um zu erraten, um was es sich handelt ("Sprachtests").

Michael Homer
quelle
6
Beachten Sie, dass es sich bei den "magischen Zahlen" ursprünglich um die ersten beiden Bytes einer ausführbaren Datei handelte, die vom Kernel zum Laden in geeigneter Weise verwendet wurden. #!ist eigentlich ein Beispiel dafür, weil der Kernel selbst, wenn er diese Bytes sieht, den folgenden Befehl aufrufen soll.
IMSoP