Linux / Befehl file: Dateitypen und -formate identifizieren
file ist ein Befehl, der den Dateityp abschätzt, indem er nicht nur die Dateierweiterung, sondern auch die Dateisysteminformationen, eindeutige Byte-Muster im Inhalt und Textmerkmale untersucht. Er kann den tatsächlichen Typ, den ausführbaren Dateityp, die Zeichenkodierung und den MIME-Typ von Dateien mit falschen Namen oder ohne Erweiterung überprüfen.
Dieser Artikel erklärt alles von der Grundnutzung bis zum MIME-Ausgabe, der Handhabung von symbolischen Links und komprimierten Dateien, dem Überprüfen mehrerer Dateien, der Nutzung von Shell-Skripten und den Vorsichtsmaßnahmen bei der Interpretation der Ergebnisse.
Ergänzende Befehle und Anwendungsfälle finden Sie in Liste der häufig verwendeten Befehle in Linux.
Was ist der Befehl file?
file untersucht jeden als Argument angegebenen Pfad und gibt eine für Menschen lesbare Beschreibung des Dateityps aus.
file README.md file photo.jpg file /usr/bin/ls
Die Ergebnisse können je nach System, file-Version und Magic-Datenbank leicht variieren. Ein gängiges Ausgabeformat ist wie folgt.
README.md: Unicode text, UTF-8 text photo.jpg: JPEG image data, JFIF standard 1.01 /usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, dynamically linked
file liest und kategorisiert den Inhalt, ohne ihn zu verändern. Es wird jedoch eine Zugriffsberechtigung auf die Datei benötigt, und die Zugriffszeit kann je nach Prüfverfahren aktualisiert werden.
Wie file den Dateityp bestimmt
Eine typische file-Implementierung führt die folgenden Prüfungen in der Reihenfolge durch und verwendet das erste erfolgreiche Testergebnis als Standardbeschreibung.
- Dateisystemprüfung: Überprüfung von Typen wie Verzeichnisse, symbolische Links, Sockets, FIFOs und leere Dateien über Metadaten.
- Prüfung anhand von Magic-Mustern: Vergleichen Sie eindeutige Byte-Muster an bestimmten Stellen in einer Datei mit der Magic-Datenbank.
- Text- und Sprachprüfung: Untersuchen Sie die Zeichencodierung und Inhaltsmerkmale, um das Textformat oder die Sprache, in der es geschrieben wurde, abzuschätzen.
Dateien mit festen Identifikationsinformationen in ihrem Format, wie PNG, JPEG, PDF und ELF-Programme, können auch ohne Erweiterung klassifiziert werden. Im Gegensatz dazu können Dateien ohne eindeutige Muster oder Inhalte, die zu kurz und mehrdeutig sind, einfach als data angezeigt werden.
Grundlegende Syntax und Verwendung
file [option] file...
Sie können nicht nur eine einzelne Datei, sondern mehrere Pfade gleichzeitig überprüfen.
file report.pdf file image.png archive.tar.gz script.sh file /etc /dev/null /usr/bin/env
Pfadnamen mit Leerzeichen oder speziellen Shell-Zeichen sollten in Anführungszeichen gesetzt werden, und verwenden Sie das Options-Endzeichen -- vor Dateinamen, die mit einem Bindestrich beginnen.
file "annual report.pdf" file -- -sample.bin
Sie können die installierte Version und die unterstützten Optionen mit folgendem Befehl überprüfen.
file --version file --help man file
Vergleichen Sie Erweiterungen und das tatsächliche Dateiformat.
Überprüfen Sie das Format auch ohne eine Erweiterung.
Linux-Ausführungsdateien oder Befehls-Skripte haben oft keine Erweiterungen. file kann das Format durch Inspektion des Inhalts anstelle des Namens überprüfen.
file /usr/bin/bash file /usr/bin/python3 file ./run-backup
Wenn ein Skript ein Shebang hat, können die Interpreter-Informationen im Ergebnis enthalten sein, und kompilierte Programme können das ELF-Format, die Architektur und die Verwendung dynamischer Verlinkung anzeigen.
Überprüfen Sie Dateien mit falschen Erweiterungen
Dies ist auch nützlich, wenn die Erweiterung einer heruntergeladenen oder erhaltenen Datei nicht mit dem tatsächlichen Inhalt übereinstimmt.
file download.dat file attachment.bin
Auch wenn das Ergebnis auf ein Bild- oder komprimiertes Format hinweist, benennt es die Datei nicht automatisch um. Bestimmen Sie die Erweiterung nach Überprüfung des notwendigen Programms und der Arbeitsregeln.
Interpretation häufiger Ergebnisse
| Typische Ausdrücke | Bedeutung |
|---|---|
directory |
Es handelt sich um ein Verzeichnis, nicht um eine reguläre Datei. |
symbolic link to ... |
Es handelt sich um einen symbolischen Link, der auf einen anderen Pfad zeigt. |
empty |
Es handelt sich um eine leere reguläre Datei mit einer Größe von 0 Bytes. |
ASCII text |
Es handelt sich hauptsächlich um Text, der aus druckbaren Zeichen im ASCII-Bereich besteht. |
Unicode text, UTF-8 |
Es wurde festgestellt, dass es sich um Unicode-Text handelt, der in UTF-8 codiert ist. |
ELF ... executable |
Es handelt sich um eine ausführbare Datei im ELF-Format, die in Linux und anderen Systemen verwendet wird. |
shared object |
Es kann als gemeinsam genutzte Bibliothek oder als positionsunabhängiges ausführbares Format identifiziert werden. |
data |
Es handelt sich um Binärdaten, die nicht ausreichend als bekanntes Format oder Text identifiziert werden konnten. |
cannot open (Datei lässt sich nicht öffnen) |
Die Datei konnte nicht geöffnet werden, da der Pfad nicht existiert oder aufgrund von Berechtigungen usw. |
Die Ergebnisse garantieren nicht die Zuverlässigkeit oder Sicherheit der Datei. Dass sie als bestimmtes Format erkannt wurde und die Einschätzung, dass sie keinen bösartigen Code enthält, sind unterschiedliche Dinge.
Überprüfung des MIME-Typs und der Zeichencodierung
Anzeigen von MIME-Typ und Codierung zusammen mit -i
-i oder --mime gibt den MIME-Typ und die Zeichencodierung aus, anstatt einer langen menschenlesbaren Beschreibung.
file -i index.html file --mime README.md
Textdateien können den MIME-Typ zusammen mit charset wie folgt anzeigen.
index.html: text/html; charset=utf-8
Nur Typ oder Codierung ausgeben
--mime-type zeigt nur den MIME-Typ an, und --mime-encoding zeigt nur die Codierungsinformationen an.
file --mime-type image.webp file --mime-encoding README.md
Verwenden Sie -b zusammen, wenn Sie nur den Wert ohne den Dateinamen benötigen.
file -b --mime-type image.webp file -b --mime-encoding README.md
Es kann in den Webserver-Einstellungen oder bei Upload-Prüfungen referenziert werden, aber man sollte eine Datei nicht allein aufgrund des vom Client gesendeten MIME-Werts oder des file-Ergebnisses als sicher beurteilen.
Anpassen des Dateinamens und der Leerzeichen in der Ausgabe
Ausgabebeschreibung nur mit -b
Die Standardausgabe ist im Format filename: description. -b oder --brief lässt das Dateinamenspräfix weg.
file -b archive.tar.gz file -b --mime-type photo.jpg
Es ist nützlich, wenn man das Ergebnis nur in einer Skriptvariablen speichern möchte.
Verfeinerung der Mehrfachdateiausgabe mit -N und -F
Beim Überprüfen mehrerer Dateien können die Dateinamen auf die gleiche Breite ausgerichtet werden. -N entfernt diese Auffüllung, und -F ändert das Trennzeichen zwischen dem Dateinamen und dem Ergebnis.
file -N file1 file-with-long-name.bin file -F ' => ' file1 file2
Bei der Automatisierung, bei der Dateinamen Trennzeichen oder Zeilenumbrüche enthalten können, sollten Sie die NUL-getrennte Option und eine sichere Handhabung der Dateiliste verwenden, anstatt direkt für Menschen lesbare Ausgaben zu parsen.
Überprüfen symbolischer Links
Überprüfen des Links selbst
Im normalen Standardverhalten werden symbolische Links nicht verfolgt, und sowohl der Link selbst als auch sein Ziel werden angezeigt. Um dieses Verhalten anzugeben, verwenden Sie -h oder --no-dereference.
file -h current.log
Da das Standardverhalten je nach dem Setzen der Umgebungsvariable POSIXLY_CORRECT variieren kann, ist es sicherer, die notwendigen Optionen in Skripten anzugeben.
Überprüfen von Linkzielen mit -L
-L oder --dereference folgt symbolischen Links, um den Typ der tatsächlichen Zieldatei zu überprüfen.
file -L current.log file --dereference latest-image
Fehlerhafte Links können die Zieldatei nicht öffnen, daher werden Ergebnisse über den Link oder Fehler angezeigt.
Überprüfen von komprimierten Dateien und internen Daten
Überprüfen des Komprimierungsformats im Standardzustand
Wenn Sie ohne Optionen überprüfen, wird im Allgemeinen das äußere Komprimierungsformat wie gzip, xz, bzip2 beschrieben.
file backup.tar.gz file archive.xz
Verwenden Sie -z, um zu dekomprimieren und das interne Format zu prüfen
-z oder --uncompress dekomprimiert Daten in unterstützten Komprimierungsformaten und ermöglicht die Inspektion der internen Inhalte.
file -z backup.tar.gz file --uncompress archive.xz
Der Dekomprimierungsprozess erfordert zusätzliche Zeit und Ressourcen. Große Dateien aus nicht vertrauenswürdigen Quellen oder Dateien, die Kompressionsbomben sein könnten, sollten in einer isolierten Umgebung mit separaten Einschränkungsrichtlinien behandelt werden.
Mehrere Dateien und Dateilisten prüfen
Mehrere Dateien mit Shell-Globs angeben
Sie können Dateien mit einer bestimmten Erweiterung im aktuellen Verzeichnis auf einmal prüfen.
file *.jpg file *.sh
Abhängig von den Shell-Einstellungen kann der Musterstring unverändert übergeben werden, wenn keine Dateien dem Glob entsprechen. Wenn es viele Dateinamen gibt, kann die Befehlszeilen-Längenbegrenzung überschritten werden.
Einlesen einer Liste von Dateinamen mit -f
-f oder --files-from liest eine Liste von Pfaden, die zeilenweise zur Überprüfung geschrieben wurden.
file -f files-to-check.txt file -F ' => ' -f files-to-check.txt
-f verarbeitet die Liste, sobald die Option auftritt, daher sollten Optionen, die die Ausgabe beeinflussen, wie -F, davor gesetzt werden.
Überprüfung der Standardeingabe und der Ergebnisse von find
Überprüfung des Datenformats der Standardeingabe
Angabe eines einzelnen Bindestrichs - als Dateiname liest Daten von der Standardeingabe.
printf '%s\n' 'hello' | file -
Die Standardeingabe kann schwer erneut gelesen werden, daher können die Ergebnisse im Detail von der Überprüfung tatsächlicher Dateien abweichen.
Rekursives Überprüfen mit find -exec
Um reguläre Dateien einschließlich Unterverzeichnissen rekursiv zu überprüfen, können Sie es mit find kombinieren.
find ./uploads -type f -exec file -- {} +
{} + gruppiert gefundene Pfade so weit wie möglich und übergibt sie an file, wobei Dateinamen mit Leerzeichen sicher behandelt werden. Wenn viele Dateien überprüft werden müssen, beschränken Sie die Pfade und die Tiefe.
Verwendung von MIME-Typen in Shell-Skripten
Sie können nur den MIME-Typ ohne den Dateinamen erhalten und die Bedingungen entsprechend verzweigen.
path='upload.bin' mime_type=$(file -b --mime-type -- "$path") case "$mime_type" in image/jpeg|image/png|image/webp) printf '%s\n' 'This is a supported image format.';; *) printf '%s\n' "Unsupported format: $mime_type" >&2 exit 1;; esac
Diese Überprüfung ist nützlich für eine schnelle Klassifizierung, ersetzt jedoch keine Sicherheitsüberprüfung. Bei der Verarbeitung tatsächlicher Uploads sollten Sie Dateigrößenbeschränkungen, sichere Decoder, separate Speicherpfade, das Entfernen von Ausführungsberechtigungen und nach Bedarf Malware-Prüfungen anwenden.
Zusammenfassung der wichtigsten Optionen
| Option | Beschreibung |
|---|---|
-b, --brief |
Dateinamenspräfixe in der Ausgabe weglassen. |
-i, --mime |
Gibt den MIME-Typ und die Zeichenkodierung aus. |
--mime-type |
Gibt nur den MIME-Typ aus. |
--mime-encoding |
Gibt nur die Informationen zur Zeichenkodierung aus. |
-L, --dereference |
Folgt symbolischen Links, um die Zieldatei zu prüfen. |
-h, --no-dereference |
Überprüft den Link selbst, ohne symbolischen Links zu folgen. |
-z, --uncompress |
Extrahiert unterstützte komprimierte Dateien und überprüft auch das interne Format. |
-k, --keep-going |
Fährt fort, andere Magic-Treffer zu überprüfen, selbst nach dem ersten Treffer. |
-f file |
Liest eine Liste von Pfaden zur Überprüfung aus der angegebenen Datei. |
-F string |
Ändert das Trennzeichen zwischen dem Dateinamen und dem Ergebnis. |
-N, --no-pad |
Entfernt die Auffüllung für die Ausrichtung von Dateinamen mit mehreren Ergebnissen. |
-p, --preserve-date |
Versucht, die Zugriffszeit von Dateien auf unterstützten Systemen vor der Überprüfung zu erhalten. |
-s, --special-files |
Liest und überprüft spezielle Dateien wie Block- oder Zeichengeräte. Nur verwenden, wenn die Risiken des Gerätezugriffs bekannt sind. |
-E |
Lässt Dateisystemfehler mit einer Fehlermeldung und Fehlerstatus enden, anstatt sie als normale Ergebnisse zu behandeln. |
-- |
Beendet die Optionsverarbeitung, um Dateinamen, die mit einem Bindestrich beginnen, sicher zu übergeben. |
Vorsichtsmaßnahmen beim Verwenden von Dateiergebnissen
Das Bestimmungsergebnis ist eine Schätzung
file klassifiziert Dateien anhand bekannter Muster und Heuristiken. Beschädigte Dateien, neue oder seltene Formate oder Dateien, die mehrere Formate kombinieren, können mehrdeutige oder unerwartete Ergebnisse liefern.
Dateiformat unterscheidet sich von Sicherheit
Selbst wenn es als Bild oder Dokument identifiziert wird, bedeutet dies nicht, dass keine schädlichen Daten enthalten sind. In sicherheitskritischen Umgebungen sollten Erweiterung, MIME-Typ und Magic-Bestimmung zusammen betrachtet und spezielle Parser sowie richtlinienbasierte Überprüfungen verwendet werden.
Seien Sie vorsichtig mit speziellen Dateien und großen Eingaben
Das Lesen von Gerätedateien mit -s oder das Überprüfen komprimierter Daten mit -z kann riskanter und kostspieliger sein als normale Dateiprüfungen. Überprüfen Sie die Quelle und Größe des Ziels und führen Sie dies mit minimalen Rechten aus.
FAQ
Prüft file hauptsächlich Dateiendungen?
Die Hauptdetektion verwendet Dateisysteminformationen, magische Muster des Inhalts, Zeichencodierung und Textmerkmale. Daher kann das Format auch dann erkannt werden, wenn keine Erweiterung vorhanden ist oder sie falsch ist, basierend auf dem tatsächlichen Inhalt.
Wie kann ich nur den MIME-Typ ohne den Dateinamen ausgeben?
Verwenden Sie file -b --mime-type filename. -b lässt das Dateinamenspräfix weg und --mime-type wählt nur den MIME-Typ aus.
Wie kann ich den Dateityp des Ziels eines symbolischen Links überprüfen?
Verwenden Sie file -L linkname. Um Informationen über den Link selbst zu überprüfen, verwenden Sie file -h linkname.
Warum wird das file-Ergebnis nur als "data" angezeigt?
Es kann daran liegen, dass kein bekanntes Muster in der Magic-Datenbank übereinstimmt und es nicht als Text identifiziert werden kann. Die Datei könnte auch beschädigt sein, zu kurz oder die installierte Magic-Datenbank erkennt dieses Format nicht.
Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter Offizielle Datei-Befehls-Handbuchquelle, Offizielle Dokumentation der file Magic-Datenbank und Offizielles Quell-Repository von file und libmagic.




