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?
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?
Réponses:
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 / OSX0D 0A( \r\n) sont des fichiers de systèmes d'exploitation Microsoft0D( \r) serait Mac OS jusqu'à la version 915( \025) serait IBM AIXMaintenant, 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.
file(1)fait, mais avec une implémentation (très) différente.
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.
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
filecommande essaie de deviner à partir du contenu du fichier comment le fichier est probablement destiné à être utilisé. Ce n'est pas infaillible.
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)
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.
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.
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.
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.