md5sum prepends '\' para a soma de verificação

21

Por que o md5sum está prefixando "\" na frente da soma de verificação ao encontrar a soma de verificação de um arquivo com "\" no nome?

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

O mesmo é observado para todos os outros utilitários.

    
por Griffin 16.02.2018 / 15:41

2 respostas

32

Isso é documentado , para o Coreutils ' md5sum :

If file contains a backslash or newline, the line is started with a backslash, and each problematic character in the file name is escaped with a backslash, making the output unambiguous even in the presence of arbitrary file names.

( arquivo é o nome do arquivo, não o conteúdo do arquivo).

b2sum , sha1sum e os vários SHA-2 se comportam da mesma maneira que md5sum . sum e cksum não; sum é fornecido somente para compatibilidade com versões anteriores (e seus antecessores não produzem saída com cotação) e cksum é especificado por POSIX e não permite este tipo de saída.

Este comportamento foi introduzido recentemente , na versão 8.25 (janeiro de 2016), com a seguinte entrada NEWS :

md5sum now ensures a single line per file for status on standard output, by using a '\' at the start of the line, and replacing any newlines with '\n'. This also affects sha1sum, sha224sum, sha256sum, sha384sum and sha512sum.

A barra invertida no início da linha serve como um sinalizador: escapes em nomes de arquivos são processados somente se a linha começar com uma barra invertida. (O escape não pode ser o comportamento padrão: ele quebraria as somas geradas com versões mais antigas do Coreutils contendo \ ou \n nos nomes de arquivos armazenados.)

    
por 16.02.2018 / 15:45
16

A resposta de Stephen Kitt abrange o o que e tentarei cobrir por que essa mudança foi implementada. Primeiro, alguém observou que um nome de arquivo contendo novas linhas 1 poderia resultar em saída ambígua . Por exemplo, considere esta saída:

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

Isso significa que havia dois arquivos foo e bar ou apenas um arquivo cujo nome de arquivo é "foo\n25af89c92254a806b2e93fffd8ac1814 bar" ? É verdade que esta última possibilidade é altamente improvável, mas é possível. Para resolver a ambiguidade, os desenvolvedores optaram por escapar de novas linhas com uma barra invertida ( \ ). A saída então se torna distinguível. No entanto, existe ainda uma outra ambiguidade:

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

O nome deste arquivo contém uma nova linha ou uma barra invertida seguida por um n ? Para resolver isso, precisamos escapar das barras invertidas também, para que o último caso se torne:

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

Finalmente, eles escolheram prefixar cada linha de saída que contém tais escapes com um \ para tornar mais fácil para um analisador detectar se o escape foi feito. Presumivelmente, isso foi feito para permitir que os analisadores manipulassem a saída de versões de escape de md5sum e de versões não-escapáveis (não-GNU). O sinalizador também significa que não é necessário fazer um escape "caro" se não for necessário. Você pode ver um exemplo dessa análise em ação em md5sum.c (linha 382 na versão vinculada).

1 Por nova linha refiro-me ao caractere \n que às vezes também é especificamente chamado de avanço de linha ou LF ; veja md5sum.c .

    
por 16.02.2018 / 22:38