Der unbekannte Befehl – „file“ der Dateikenner

Der Befehl ist nützlich wenn wir Dateien haben und wissen wollen welchen Zweck diese Datei hat. In der Windows-Welt bestimmt oft die Dateiendung über die potentielle Funktion einer Datei. Windows-Benutzer sehen diese Endung oft überhaupt nicht da sie vom Betriebssystem ausgeblendet wird und es stillschweigend davon ausgeht, dass die Endung korrekt ist – was in den allermeisten Fällen sicher auch zutreffen wird. Jedoch ist es sowohl unter Windows als auch unter Linux möglich einer Datei eine falsche Dateiendung zu geben. Böse Buben machen dies z.B. um bei schädlichen Email-Anhängen die Funktion zu verschleiern. Eine Datei mit dem Namen boese_datei.pdf.exe wird unter Windows oft nur als boese_datei.pdf angezeigt da die Dateiendung verschleiert wird und erscheint dadurch eine harmlose PDF-Datei statt ein ausführbares Programm zu sein.

Linux ist hier nicht so „dateiendungsfixiert“ und viele Dateien haben überhaupt keine Endung ohne ein ausführbares Programm zu sein. Die Funktion einer Datei kann, anders als unter Windows-Bordmitteln, auch mit Betriebssystemmitteln bestimmt werden ohne diese aufzurufen oder auszulesen. Dateien werden hier über eine Datenbank von magic numbers bestimmt; d.h. jede Datei beginnt, je nach Funktion, mit einer bestimmten Zeichenfolge welche in einer Datenbank unter /usr/share/misc/magic.mgc hinterlegt ist.

Das Auslesen der magic number einer Datei kann mit xxd <dateiname>|head erfolgen:

$ xxd example.png | head
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 0082 0000 0046 0806 0000 0000 7a4c .......F......zL
00000020: 5f00 001e 397a 5458 7452 6177 2070 726f _...9zTXtRaw pro
00000030: 6669 6c65 2074 7970 6520 6578 6966 0000 file type exif..
00000040: 78da ad9b 698e 9cb9 9545 ff73 15bd 04ce x...i....E.s....
00000050: c372 c847 12e8 1df4 f2fb 5c46 482a c965 .r.G......\FH*.e
00000060: 0336 9c09 5566 46c4 37bd e10e 8f2c 77fe .6..UfF.7....,w.
00000070: ef7f affb 1fbe ea28 dee5 d27a 1db5 7abe .......(...z..z.
00000080: f2c8 234e 7ee9 fef3 f5f9 197c 7eff fdbc ..#N~......|~...
00000090: 14bf ef85 df5f 77b9 7edf 88bc 94f8 993e ....._w.~......>

89 50 4e 47 0d 0a 1a 0a ist hier die magic number von einem png-Bild. Für eine .zip-Datei sieht das folgendermaßen aus:

$ xxd 'Linus Torvalds-just for fun.zip' | head
00000000: 504b 0304 1400 0000 0800 845c fa2a 7cc5 PK.........\.*|.
00000010: a646 d731 1100 4f0d 1300 1f00 0000 4c69 .F.1..O.......Li
00000020: 6e75 7320 546f 7276 616c 6473 2d6a 7573 nus Torvalds-jus
00000030: 7420 666f 7220 6675 6e2e 7064 66b4 bd03 t for fun.pdf...
00000040: 7866 4bba 369c 4e77 ac8e 8d4e d2b1 6ddb xfK.6.Nw...N..m.
00000050: b66d 9b1d 271d dbb6 6ddb b66d 1b6f f0f7 .m..'...m..m.o..
00000060: 9e33 d8e7 cc3e dfb7 67be f973 e57a 5755 .3...>..g..s.zWU
00000070: adaa 5555 4fd5 aa75 3faa fa2e 2320 4449 ..UUO..u?...# DI
00000080: 4bc5 00f3 7d67 7772 1606 9216 8f06 cf5a K...}gwr.......Z
00000090: cf0c 8683 030f 865a c1d5 c610 8f5a 46d7 .......Z.....ZF.

50 4b 03 04 ist hier die magic number von zip-Archiven. Was passiert wenn wir die Dateiendung verändern?

$ xxd 'Linus Torvalds-just for fun.zip' | head -n 1
00000000: 504b 0304 1400 0000 0800 845c fa2a 7cc5 PK.........\.*|.
$ mv 'Linus Torvalds-just for fun.zip' 'Linus Torvalds-just for fun.png'
$ xxd 'Linus Torvalds-just for fun.png' | head -n 1
00000000: 504b 0304 1400 0000 0800 845c fa2a 7cc5 PK.........\.*|.

Man sieht, dass die magic number erhalten geblieben ist.

Nun ist das jetzt eine reichlich umständliche Art Datei-Typen zu identifizieren. Nun kommt das Linux-Kommando file ins Spiel. Das Kommando file liest die magic number einer Datei aus und vergleicht sie mit der Datenbank und zeigt als Ergebnis den Dateityp an.

$ file example.png 
example.png: PNG image data, 130 x 70, 8-bit/color RGBA, non-interlaced
$ file 'Linus Torvalds-just for fun.zip' 
Linus Torvalds-just for fun.zip: Zip archive data, at least v2.0 to extract

Man kann auch, anders wie oben gezeigt mit file mehrere Dateien überprüfen:

$ file example.png 'Linus Torvalds-just for fun.zip' 
example.png: PNG image data, 130 x 70, 8-bit/color RGBA, non-interlaced
Linus Torvalds-just for fun.zip: Zip archive data, at least v2.0 to extract

Die Option -b ist eher was für das Shellscripting weil es in der Ausgabe die abgefragte Datei weg lässt:

$ file -b example.png 
PNG image data, 130 x 70, 8-bit/color RGBA, non-interlaced

Eine nützliche Option ist auch die -z. Beim obigen zip-File wird anzeigt, dass es sich um ein zip-Archiv handelt aber nicht der Inhalt des Archivs untersucht. Mit der Option -z versucht file den Inhalt des Archivs zu durchsuchen:

$ file -z 'Linus Torvalds-just for fun.zip' 
Linus Torvalds-just for fun.zip: PDF document, version 1.4 (Zip archive data, at least v2.0 to extract)

Diese Option funktioniert jedoch nicht mit jedem Archiv-Typ und interessanterweise nicht mit dem unter Linux verbreitetsten tar.gz-Archiv was lediglich als „POSIX tar archive (GNU) (gzip compressed data, last modified: Thu Mar 29 08:31:51 2007, from Unix)“ angezeigt wird.

Die Option -i schließlich zeigt den MIME-Typ einer Datei an:

$ file -i 'Linus Torvalds-just for fun.zip' 
Linus Torvalds-just for fun.zip: application/zip; charset=binary

1 Gedanke zu „Der unbekannte Befehl – „file“ der Dateikenner“

Kommentare sind geschlossen.

kais-universum.de