web-dev-qa-db-fra.com

MD5Sum achète '\' à la somme de contrôle

Pourquoi MD5Sum est-il préparé "\" devant la somme de contrôle lors de la recherche de la somme de contrôle d'un fichier avec "\" dans le nom?

$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e  /tmp/test\\test

Il en va de même pour chaque autre utilité.

22
jsaji

Ceci est documenté , pour Coreutils 'md5sum:

Si Fichier contient une barre oblique inverse ou une nouvelle ligne, la ligne est démarrée avec une barre oblique inverse et chaque caractère problématique du nom de fichier est échappé avec une barre oblique inverse, en faisant le production sans ambiguïté même en présence de noms de fichiers arbitraires.

( Fichier est le nom de fichier, pas le contenu du fichier).

b2sum , sha1sum et les divers outils SHA-2 se comporter de la même manière que md5sum. sum et cksum Pas; sum _ est uniquement prévu pour la compatibilité à l'envers (et ses ancêtres ne produisent pas une sortie citée), et cksum est spécifié par POSIX et ne permet pas ce type de la sortie.

Ce comportement était introduit en novembre 2015 et publié dans la version 8.25 (janvier 2016), avec l'entrée suivante NEWS:

md5sum assure maintenant une seule ligne par fichier pour statut sur la sortie standard, en utilisant un "\ 'au début de la ligne et en remplaçant les nouvelles lignes avec"\n ". Cela affecte également sha1sum, sha224sum, sha256sum, sha384sum et sha512sum.

La barre oblique inverse au début de la ligne sert de drapeau: les évasions des noms de fichiers ne sont traitées que si la ligne commence avec une barre oblique inverse. (Unescaping ne peut pas être le comportement par défaut: il briserait des sommes générées par des versions plus anciennes de Coreutils contenant \\ ou \n Dans les noms de fichiers stockés.)

33
Stephen Kitt

La réponse de Stephen Kitt couvre le quoi et je vais essayer de couvrir pourquoi Le changement a été mis en œuvre. Tout d'abord, quelqu'un a observé qu'un nom de fichier contenant de nouvelles lignes1 pourrait entraîner une sortie ambiguë . Par exemple, considérez cette sortie:

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

Cela signifie-t-il qu'il y avait deux fichiers foo et bar ou un seul fichier dont le nom de fichier est "foo\n25af89c92254a806b2e93fffd8ac1814 bar"? Certes, cette dernière possibilité est très improbable, mais c'est possible. Pour résoudre l'ambiguïté, les développeurs ont choisi d'échapper à de nouvelles lignes avec une barre oblique inverse (\). La sortie devient alors distinguée. Cependant, il y a une autre ambiguïté:

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

Le nom de ce fichier contient-il une nouvelle ligne ou une barre oblique inverse suivie d'un n? Pour résoudre ce problème, nous devons aussi échapper aux backslashes, afin que ce dernier cas devienne:

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

Enfin, ils ont choisi de préparer chaque ligne de sortie qui contient de telles échappées avec un \\ Pour faciliter l'analyse d'un analyseur de détecter si l'échappement a été effectué. Cela a probablement été fait pour permettre aux analyseurs de gérer la production à partir de versions de l'échappement de md5sum et à partir de versions non échappées (non-GNU). Le drapeau signifie également que "coûteux" non-échappement n'a pas besoin d'être fait lorsqu'il n'est pas nécessaire. Vous pouvez voir un exemple de cette analyse d'action dans md5sum.c lui-même (ligne 382 dans la version liée).


1 Par Newline Je veux dire le caractère \n qui est parfois aussi désigné spécifiquement comme un ligne de ligne ou [~ # ~ # ~ # ~ ] ; voir md5sum.c .

17
TypeIA