Ich möchte wissen, wie Dateitypen bekannt sind, wenn Dateinamen keine Suffixe haben.
Zum Beispiel könnte eine Datei mit dem Namen myfile
"Binär" oder "Text" beginnen. Woher weiß das System, ob die Datei binär oder Text ist?
files
filesystems
mime-types
file-opening
Niklas Rosencrantz
quelle
quelle
Antworten:
Das
file
Dienstprogramm ermittelt den Dateityp auf drei Arten:Zuerst die Dateisystemtests : Innerhalb dieser Tests wird einer der Systemaufrufe der stat- Familie für die Datei aufgerufen. Dies gibt die verschiedenen Unix-Dateitypen zurück : reguläre Datei, Verzeichnis, Verknüpfung, Zeichengerät, Blockgerät, Named Pipe oder Socket. Abhängig davon werden die Zaubertests gemacht.
Die Zaubertests sind etwas komplexer. Dateitypen werden von einer Datenbank mit Mustern erraten, die als magische Datei bezeichnet wird . Einige Dateitypen können durch Lesen eines Bits oder einer Zahl an einer bestimmten Stelle in der Datei bestimmt werden (z. B. Binärdateien). Die magische Datei enthält " magische Zahlen ", um zu testen, ob sie enthalten sind oder nicht und welche Textinformationen gedruckt werden sollen. Diese " magischen Zahlen " können 1-4-Byte-Werte, Zeichenfolgen, Datumsangaben oder sogar reguläre Ausdrücke sein. Bei weiteren Tests können zusätzliche Informationen gefunden werden. Im Fall eines ausführbaren würden zusätzliche Informationen, ob es dynamisch verbunden oder nicht, gestripptoder nicht oder die Architektur. Manchmal müssen mehrere Tests bestanden werden, bevor der Dateityp wirklich identifiziert werden kann. Aber egal wie viele Tests durchgeführt werden, es ist immer nur eine gute Vermutung .
Hier sind die ersten 8 Bytes in einer Datei mit einigen gebräuchlichen Dateitypen, die uns helfen können, ein Gefühl dafür zu bekommen, wie diese magischen Zahlen aussehen können:
Wenn der Dateityp bei Zaubertests nicht gefunden werden kann, scheint die Datei eine Textdatei zu sein und
file
sucht nach der Kodierung des Inhalts. Die Codierung unterscheidet sich durch die verschiedenen Bereiche und Folgen von Bytes, die in jedem Satz druckbaren Text bilden.Die Zeilenumbrüche werden ebenfalls abhängig von ihren HEX-Werten untersucht:
0A
(\n
) klassifiziert eine mit Un * x / Linux / BSD / OSX terminierte Datei0D 0A
(\r\n
) sind Dateien von Microsoft-Betriebssystemen0D
(\r
) wäre Mac OS bis Version 915
(\025
) wäre IBMs AIXJetzt starten die Sprachtests . Wenn es sich um eine Textdatei zu handeln scheint, wird die Datei nach bestimmten Zeichenfolgen durchsucht, um herauszufinden, welche Sprache sie enthält (C, Perl, Bash). Einige Skriptsprachen können auch über den Hashbang (
#!/bin/interpreter
) in der ersten Zeile des Skripts identifiziert werden .Wenn für die Datei nichts zutrifft, kann der Dateityp nicht bestimmt werden und gibt
file
nur "Daten" aus.Sie sehen also, dass kein Suffix erforderlich ist. Ein Suffix könnte sowieso verwirren, wenn es falsch eingestellt ist.
quelle
file(1)
tut, jedoch mit einer (sehr) unterschiedlichen Implementierung.Oft ist es egal. Sie übergeben es einfach an ein Programm und entweder interpretiert es es oder nicht. Es ist möglicherweise nicht sinnvoll, eine JPG-Datei in einem Texteditor zu öffnen. Sie werden jedoch nicht daran gehindert, dies zu tun. Die Erweiterung dient, wie der Rest des Dateinamens, der organisatorischen Bequemlichkeit des Menschen.
Es kann auch möglich sein, Dateien zu erstellen, die auf mehrere Arten gültig interpretiert werden können. Da das ZIP-Dateiformat mit einem Header am Ende der Datei beginnt , können Sie andere Dinge voranstellen und es wird weiterhin als ZIP-Datei geladen. Dies wird häufig verwendet, um selbstextrahierende ZIP-Dateien zu erstellen.
quelle
Diese Informationen befinden sich normalerweise im Header der Datei. Der
file
Befehl analysiert das Ziel und informiert Sie über die Datei. Viele Informationen werden häufig aus Datei-Headern abgeleitet, die häufig die ersten Bytes einer Datei sind (siehe unten). Header werden vom System verwendet, um herauszufinden, wie mit Dateien umgegangen wird.#!/bin/bash
am Anfang einer Datei weist das System an, die Bash-Shell zu verwenden, um das folgende Skript zu interpretieren.ELF
teilt dem System mit, dass es sich um eine ausführbare ELF-Datei handelt.Beispiele für Dateikopfzeilen:
quelle
file
Befehl versucht aus dem Inhalt der Datei zu erraten, wie die Datei wahrscheinlich verwendet werden soll. Es ist nicht unfehlbar.file
. Tatsächlich wird eine Analyse der Datei durchgeführt. Die meisten Dateitypen sind jedoch durch eine Art Header gekennzeichnet.0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
ist ein Header einer ausführbaren ELF-Datei (die ersten Bytes von / bin / ls). Ähnlich#!/bin/bash
oben in einer ASCII-Datei würde es als Shell-Skript identifiziert. Ein weiteres Beispiel:0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(ein .png-Bild)Als Erstes muss der fest codierte Dateityp überprüft werden, der vom Kernel erkannt wird. Dies sind die Dateitypen wie Verzeichnis, Zeichenspezialdatei, Blockspezialdatei, Pipe-Spezialdatei, Socket und symbolische Verknüpfung. Diese Informationen stammen aus dem Inode der Datei. Wenn es sich bei der Datei um eine einfache Datei handelt, werden die ersten 256 Bytes nach Mustern durchsucht, um die nächsten Informationen zu erhalten. Somit werden die Textdateien und der C-Quellcode durch Untersuchen dieser Bytes erkannt. Darüber hinaus suchen die Dienstprogramme nach einer magischen Zahl , mit der der Dateityp getestet und validiert wird. Sie können eigene Dateitypen hinzufügen, die erkannt werden sollen, indem Sie die Informationen zur Datei hinzufügen
/etc/magic
. Informationen zummagic(5)
Format der Magic-Datei finden Sie auf der Manpage .In älteren Implementierungen (z. B. Solaris) wurden in der Datei
/etc/magic
die meisten erkannten Dateitypen aufgelistet.quelle
Der
file
Befehl wendet einige Heuristiken an, indem er (Teile) der Datei inspiziert und eine qualifizierte Schätzung vornimmt. Darüber hinaus gibt es einige Sonderfälle, in denen zusätzliche Informationen erhältlich sind. B.#!
am Anfang einer Textdatei, einer Stückliste (Byte Order Mark) oder bestimmten Header-Bytes ausführbarer Dateiformate. Die#!
Binärzeichen und in ausführbaren Dateien werden vom System verwendet, um sie voneinander zu unterscheiden.quelle
Das System weiß nicht, ob es sich bei einer Datei um eine Binärdatei oder eine Textdatei handelt. In allen (AFAIK) Unix-Betriebssystemen
fopen(path, "rb")
ist genau das gleiche wiefopen(path "r")
- dasb
hat keine Auswirkung. Es wird akzeptiert, weil Standard C auf einige andere Betriebssysteme portierbar sein muss, die eine solche Unterscheidung treffen.quelle
In guten alten Zeiten von Mainframe-Commputern unterstützten ihre Betriebssysteme mehrere Dateitypen, einschließlich sequentieller und index-sequentieller. Moderne Betriebssysteme (Un * x und möglicherweise Windows) reduzieren die Menge der Dateitypen auf ein Minimum (einschließlich ausführbarer, gemeinsam genutzter Objekte).
Es ist möglich, dass es ein schwieriges Dateiformat gibt: einen Teil des C-Codes, der als Bildbeschreibung interpretiert werden kann. Daneben gibt es verschiedene Formate, die immer spezifischer werden: Textdatei, XML-Datei, ein SOAP-Dokument.
quelle