Wie sind Dateitypen bekannt, die nicht aus dem Dateisuffix stammen?

55

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?

Niklas Rosencrantz
quelle
3
Nur ein Kommentar, die restlichen Antworten decken alles ab. Heutzutage kann es vorkommen, dass mit einem falsch konfigurierten Gebietsschema oder alten ausführbaren Dateien einige utf-8-Dateien aufgrund von Nicht-ASCII-Bytes als Binärdaten falsch erkannt werden.
Orion
19
Das System kümmert sich nicht darum. Bestimmte Anwendungen mögen sich darum kümmern, aber sie haben jeweils ihre eigenen Möglichkeiten, damit umzugehen.
Jwodder
2
Beachten Sie, dass "Dateityp" auch für reguläre Dateien (keine Gerätedateien, Unix-Domain-Sockets, Named Pipes usw.) zwei verschiedene Bedeutungen haben kann: (1) Ein bestimmtes Dateiformat (".docx", XML, MS-DOS-Textformat , RTF, Datensätze mit fester Länge, die Liste könnte sehr lang sein) oder (2) Eine Datei, mit der eine bestimmte App umgehen kann (".xlsx" oder ".doc" oder was auch immer, es gibt Überschneidungen mit dem Formattyp) . Es lohnt sich, diese Unterscheidung zu berücksichtigen, wenn man vom "Dateityp" spricht.
Bruce Ediger
@jwodder Das System kümmert sich. Es ist das System, das sich beschwert, dass Sie keine nicht ausführbare Datei ausführen können, wenn Sie es versuchen, nicht diese Anwendungen!
Herr Lister,
1
@MrLister Wahr, aber ausführbar / nicht ausführbar hat nichts mit 'Erweiterung' zu tun.
user2338816

Antworten:

84

Das fileDienstprogramm 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 filesucht 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 Datei
  • 0D 0A( \r\n) sind Dateien von Microsoft-Betriebssystemen
  • 0D( \r) wäre Mac OS bis Version 9
  • 15( \025) wäre IBMs AIX

Jetzt 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 filenur "Daten" aus.

Sie sehen also, dass kein Suffix erforderlich ist. Ein Suffix könnte sowieso verwirren, wenn es falsch eingestellt ist.

Chaos
quelle
4
Es gibt auch die gemeinsam genutzte MIME-Datenbank von freedesktop.org, die von praktisch allen X11-Anwendungen verwendet wird. Dies ähnelt im Konzept dem, was file(1)tut, jedoch mit einer (sehr) unterschiedlichen Implementierung.
lcd047
4
Beachten Sie, dass das Ergebnis dieses Vorgangs im Grunde genommen eine Vermutung ist und für nichts Wichtiges herangezogen werden sollte. (Praktische Funktionen, wie das
Festlegen
Wenn ich also% PNG am Anfang einer Textdatei hinzufüge, wird diese als PNG-Datei angezeigt. Richtig??
Saga
@saga Wenn Sie die Kodierung richtig verstehen und ein Promille-Zeichen anstelle eines Prozentzeichens setzen, dann: vielleicht. Es kann zusätzliche Tests geben.
Bananguin,
19

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.

pjc50
quelle
4
Zu letzterem Absatz: Funky File Formats ist ein interessanter Vortrag zu diesem Thema, in dem z. B. ein JPEG vorgestellt wird, das auch ein Java-Hallo-Welt-Programm ist. Nach der AES-Verschlüsselung wird es zu einem PNG oder nach der 3DES-Entschlüsselung wird es zu einem PDF und mehr. alle mit "interessanten" Inhalten, dh nicht nur mit weißem Rauschen oder Artefakten)
Hagen von Eitzen
14

Diese Informationen befinden sich normalerweise im Header der Datei. Der fileBefehl 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/basham Anfang einer Datei weist das System an, die Bash-Shell zu verwenden, um das folgende Skript zu interpretieren. ELFteilt 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
h3rrmiller
quelle
3
Das ist eher irreführend. Unix-Dateien haben per se keinen "Header". Der fileBefehl versucht aus dem Inhalt der Datei zu erraten, wie die Datei wahrscheinlich verwendet werden soll. Es ist nicht unfehlbar.
Nate Eldredge
Sie haben Recht damit, wie Sie das Verhalten von erklärt haben 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/bashoben 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)
h3rrmiller
2
Aber Ihre Antwort lässt es so klingen, als sei ein Header ein inhärentes Merkmal einer Unix-Datei. Beispielsweise haben Textdateien keinen solchen Header. Jemand wie das OP würde wahrscheinlich annehmen, dass eine C-Quelldatei und eine Java-Quelldatei unterschiedliche "Dateitypen" haben, aber es gibt keinen Header, um sie zu unterscheiden. Ich würde argumentieren, dass "Dateityp" unter Unix nicht einmal ein aussagekräftiges Konzept ist; Das Betriebssystem stellt lediglich ein Dateisystem bereit, und es liegt an jeder Anwendung, zu entscheiden, was der Inhalt einer bestimmten Datei bedeutet.
Nate Eldredge
Genau. Ich habe versucht, so einfach wie möglich zu antworten, ohne zu viele Hasenlöcher abzubauen.
h3rrmiller
7

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/magicdie meisten erkannten Dateitypen aufgelistet.

entmutigen
quelle
4

Der fileBefehl 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.

Janis
quelle
4

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 bhat keine Auswirkung. Es wird akzeptiert, weil Standard C auf einige andere Betriebssysteme portierbar sein muss, die eine solche Unterscheidung treffen.

Toby Speight
quelle
0

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.

ijbalazs
quelle
1
Was die Dateiformate angeht, ist XPM nicht so schwierig. Ich halte es für "schwierig", mit etwas zu beginnen, das sowohl eine gültige JPEG- als auch eine gültige ZIP-Datei ist.
Mark