Comment les types de fichiers sont-ils connus s'ils ne proviennent pas d'un suffixe?

55

J'aimerais savoir comment les types de fichiers sont connus si les noms de fichiers n'ont pas de suffixe.

Par exemple, un fichier nommé myfilepeut être binaire ou texte pour commencer, comment le système sait-il si le fichier est binaire ou texte?

Niklas Rosencrantz
la source
3
Juste un commentaire, le reste des réponses couvre tout. De nos jours, il peut arriver qu'avec des paramètres régionaux mal configurés ou d'anciens exécutables, certains fichiers utf-8 soient mal détectés en tant que données binaires en raison d'octets non ascii.
orion
19
Le système s'en fiche. Certaines applications peuvent être utiles, mais elles ont chacune leur propre manière de gérer cela.
jwodder
2
Notez que même pour les fichiers normaux (pas les fichiers de périphérique, les sockets de domaine unix, les pipes nommées, etc.), "type de fichier" peut signifier deux choses différentes: (1) Un format de fichier particulier (".docx", XML, format de texte MS-DOS , RTF, enregistrements de longueur fixe, la liste peut être très longue) ou (2) Un fichier qu’une application particulière sait traiter (".xlsx" ou ".doc" ou autre, il y a un chevauchement avec le type de format) . Il convient de garder cette distinction à l'esprit lorsque l'on parle de "type de fichier".
Bruce Ediger
@jwodder Le système est efficace. C'est le système qui se plaint de l'impossibilité d'exécuter un fichier non exécutable lorsque vous essayez, pas de ces applications!
M. Lister
1
@MrLister Certes, mais exécutable / non-exécutable n'a rien à voir avec 'extension'.
user2338816

Réponses:

84

L' fileutilitaire détermine le type de fichier de 3 manières:

Premièrement, les tests du système de fichiers : Dans ces tests, un des appels système de la famille stat est appelé sur le fichier. Cela retourne les différents types de fichiers unix : fichier normal, répertoire, lien, périphérique de caractère, périphérique de bloc, canal nommé ou un socket. En fonction de cela, les tests magiques sont effectués.

Les tests magiques sont un peu plus complexes. Les types de fichiers sont définis par une base de données de modèles appelée fichier magique . Certains types de fichiers peuvent être déterminés en lisant un bit ou un nombre à un endroit particulier du fichier (fichiers binaires par exemple). Le fichier magique contient des " nombres magiques " pour tester le fichier, qu'il le contienne ou non, et quelles informations textuelles doivent être imprimées. Ces " nombres magiques " peuvent être des valeurs de 1 à 4 octets, des chaînes, des dates ou même des expressions régulières. Avec d'autres tests, des informations supplémentaires peuvent être trouvées. Dans le cas d’un exécutable, l’information supplémentaire serait de savoir si elle est liée dynamiquement ou non, suppriméeou pas ou l'architecture. Parfois, plusieurs tests doivent réussir avant que le type de fichier puisse être vraiment identifié. Quoi qu'il en soit, le nombre de tests effectués n'a pas d'importance, c'est toujours une bonne idée .

Voici les 8 premiers octets dans un fichier de types de fichiers courants qui peuvent nous aider à avoir une idée de ce à quoi ces chiffres magiques peuvent ressembler:

             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

Si le type de fichier ne peut pas être trouvé lors de tests magiques, le fichier semble être un fichier texte et filerecherche l'encodage du contenu. Le codage se distingue par les différentes plages et séquences d'octets qui constituent du texte imprimable dans chaque ensemble.

Les sauts de ligne sont également étudiés, en fonction de leurs valeurs HEX:

  • 0A( \n) classe un fichier terminé Un * x / Linux / BSD / OSX
  • 0D 0A( \r\n) sont des fichiers de systèmes d'exploitation Microsoft
  • 0D( \r) serait Mac OS jusqu'à la version 9
  • 15( \025) serait IBM AIX

Maintenant, les tests de langue commencent. S'il semble s'agir d'un fichier texte, des chaînes particulières sont recherchées dans le fichier pour déterminer la langue qu'il contient (C, Perl, Bash). Certains langages de script peuvent également être identifiés via hashbang ( #!/bin/interpreter) dans la première ligne du script.

Si rien ne s'applique au fichier, le type de fichier ne peut pas être déterminé et filen'imprime que des "données".

Donc, vous voyez qu'il n'y a pas besoin de suffixe. Un suffixe peut de toute façon confondre, s'il est mal défini.

le chaos
la source
4
Il existe également la base de données MIME partagée freedesktop.org, utilisée par pratiquement toutes les applications X11. C'est un concept similaire à ce qui est file(1)fait, mais avec une implémentation (très) différente.
lcd047
4
Notez que le résultat de ce processus est essentiellement une supposition, et ne devrait pas être invoqué pour quoi que ce soit d'important. (Les fonctionnalités pratiques, telles que le choix du programme par défaut pour ouvrir le fichier, conviennent)
user253751 le
Donc, si j'ajoute% PNG en haut d'un fichier texte, il sera considéré comme un fichier png. Droite??
Saga
@saga Si vous obtenez le bon encodage et si vous mettez un signe pour mille au lieu d'un signe pour cent alors: peut-être. Il peut y avoir des tests supplémentaires.
Bananguin
19

Souvent, il s'en fiche. Vous le transmettez simplement à un programme et il l'interprète ou non. Il peut ne pas être utile d'ouvrir un fichier .jpg dans un éditeur de texte, mais cela ne vous empêche pas. L'extension, comme le reste du nom de fichier, est pour le confort organisationnel des humains.

Il peut également être possible de construire des fichiers pouvant être interprétés valablement de plusieurs manières. Étant donné que le format du fichier ZIP commence par un en-tête à la fin du fichier , vous pouvez ajouter d'autres éléments au début et le chargement se fera toujours sous la forme d'un fichier ZIP. Ceci est couramment utilisé pour créer des fichiers zip auto-extractibles.

pjc50
la source
4
Concernant le dernier paragraphe: Funky File Formats est une présentation intéressante sur ce sujet. Il présente par exemple un fichier jpeg qui est également un programme java hello world. Après le cryptage AES, il devient un fichier PNG, ou après le décryptage par 3DES, il devient un PDF et plus ( tous avec un contenu "intéressant", c'est-à-dire pas seulement avec du bruit blanc ou des artefacts)
Hagen von Eitzen
14

Cette information se trouve généralement dans l'en-tête du fichier. La filecommande analyse la cible et vous indique des informations sur le fichier. Une grande partie de l'information provient souvent des en-têtes de fichier qui sont souvent les premiers octets d'un fichier (voir ci-dessous). Les en-têtes sont utilisés par le système pour déterminer comment gérer les fichiers. #!/bin/bashau début d'un fichier indique au système d'utiliser le shell bash pour interpréter le script suivant. ELFindique au système qu'il s'agit d'un exécutable ELF.

[~] 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

Exemples d'en-tête de fichier:

[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
la source
3
Ceci est plutôt trompeur. Les fichiers Unix n’ont pas d’en-tête. La filecommande essaie de deviner à partir du contenu du fichier comment le fichier est probablement destiné à être utilisé. Ce n'est pas infaillible.
Nate Eldredge
Vous avez raison dans la façon dont vous avez expliqué le comportement de file. En fait, il fait une analyse du fichier. Cependant, la plupart des types de fichiers sont identifiés par un en-tête de tri. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............est un en-tête d'un exécutable ELF (quelques premiers octets de / bin / ls). De même, #!/bin/bashen haut d'un fichier ASCII, il serait identifié comme un script shell. Autre exemple: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR(une image .png)
h3rrmiller le
2
Mais votre réponse donne l’impression qu’un en-tête est une caractéristique inhérente à un fichier Unix. Les fichiers texte, par exemple, n'ont pas d'en-tête de ce type; quelqu'un comme l'OP considérerait probablement qu'un fichier source C et un fichier source Java ont des "types de fichiers" différents, mais aucun en-tête ne permet de les distinguer. Je dirais que le "type de fichier" n’est même pas un concept significatif sous Unix; le système d'exploitation fournit uniquement un système de fichiers, et il appartient à chaque application de décider de la signification du contenu d'un fichier.
Nate Eldredge
Je suis d'accord. J'essayais de répondre aussi simplement que possible sans descendre trop de terriers de lapin.
h3rrmiller
7

La première chose à vérifier est le type de fichier codé en dur qui est reconnu par le noyau. Il s'agit des types de fichiers tels que répertoire, fichier spécial caractères, fichier spécial bloc, fichier spécial tuyau, socket et lien symbolique. Cette information provient de l'inode du fichier. Si le fichier est un fichier brut, le prochain ensemble d'informations provient des 256 premiers octets en recherchant des modèles. Ainsi, les fichiers texte et le code source C sont reconnus en examinant ces octets. En outre, les utilitaires recherchent également un nombre magique utilisé pour tester et valider le type de fichier. Vous pouvez ajouter vos propres types de fichiers à reconnaître en ajoutant les informations au fichier /etc/magic. Reportez-vous à la page de manuel pour magic(5)voir le format du fichier magique.

Dans les implémentations plus anciennes (Solaris, par exemple), le fichier /etc/magicénumère la plupart des types de fichiers reconnus.

unxnut
la source
4

La filecommande applique des méthodes heuristiques lors de l’inspection (d’une partie) du fichier et de la définition d’une estimation. De plus, il existe des cas particuliers dans lesquels des informations supplémentaires peuvent être obtenues; comme #!au début d'un fichier texte, une BoM (marque d'ordre d'octet) ou des octets d'en-tête spécifiques de formats de fichier exécutables. Les #!marques et binaires dans les exécutables sont utilisées par le système pour les différencier.

Janis
la source
4

Le système ne sait pas si un fichier est binaire ou texte. Dans tous les systèmes d’exploitation (AFAIK) de type Unix, fopen(path, "rb")c’est exactement la même chose que fopen(path "r")- cela bn’a aucun effet. Il est accepté car la norme C doit être portable sur certains systèmes d'exploitation qui font une telle distinction.

Toby Speight
la source
0

Je dirais que le "type de fichier" n’est même pas un concept significatif sous Unix;

Dans le bon vieux temps des systèmes centraux, leur système d'exploitation prenait en charge plusieurs types de fichiers, notamment séquentiel et séquentiel indexé. Les systèmes d'exploitation modernes (Un * x et sans doute Windows) réduisent au minimum l'ensemble des types de fichiers (y compris les objets exécutables et partagés).

Il peut également être possible de construire des fichiers pouvant être interprétés valablement de plusieurs façons.

C'est possible, il existe un format de fichier délicat: un morceau de code C qui peut être interprété comme une description d'image. De plus, il existe différents formats de moins en moins spécifiques: fichier texte, fichier XML, un document SOAP.

ijbalazs
la source
1
En ce qui concerne les formats de fichiers, XPM n’est pas si compliqué. Je considère «difficile» de commencer avec quelque chose qui est à la fois un fichier JPEG valide et un fichier ZIP valide.
Mark