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?
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?
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:
Hexadecimal ASCII
PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|....
JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex
JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF
ZIP 50 4B 03 04|0A 00 00 00 PK..|....
PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5
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.
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.
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.
[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[~] root@www # file /etc/passwd
/etc/passwd: ASCII text
Beispiele für Dateikopfzeilen:
[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c ...4...o.....b.<
[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000 ..>......$@.....
[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20 "$1" ] && echo
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 zum magic(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.
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.
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 wie fopen(path "r")
- das b
hat keine Auswirkung. Es wird akzeptiert, weil Standard C auf einige andere Betriebssysteme portierbar sein muss, die eine solche Unterscheidung treffen.
Ich würde argumentieren, dass "Dateityp" unter Unix nicht einmal ein aussagekräftiges Konzept ist;
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 kann auch möglich sein, Dateien zu erstellen, die auf mehrere Arten gültig interpretiert werden können
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.