md5sumはチェックサムの先頭に「\」を追加します


22

名前に「\」が含まれるファイルのチェックサムを見つけるときに、md5sumがチェックサムの前に「\」を追加しているのはなぜですか?

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

他のすべてのユーティリティについても同様です。


参考のために、GNU coreutils の他の*sumユーティリティ(と同じファミリmd5sum、たとえば、g sha1sumなど)も同じことを行います。
クサラナナンダ

この動作は表示されません。ユーティリティのバージョンは何md5sum --version
ですか?

@Kusalanandaこれは、coreutilsのバージョン固有の可能性があります。CentOS 7 cksumではサポートしていません。例% cksum test\\test 3915528286 4 test\test
スティーブンハリス

@StephenHarrisこれはおそらくcksum POSIXユーティリティとその仕様が原因です。それを許可していません。
クサラナナンダ

回答:


33

これはCoreutils 'について文書化されていますmd5sum

ファイルにバックスラッシュまたは改行が含まれる場合、行はバックスラッシュで始まり、ファイル名の問題のある各文字はバックスラッシュでエスケープされ、任意のファイル名が存在する場合でも出力が明確になります。

fileはファイルの内容ではなくファイル名です)。

b2sumsha1sumおよびさまざまなSHA-2ツールは、と同じように動作しmd5sumます。sumそして、cksumはありません。sumのみ(とその祖先が引用された出力を生成しません)後方互換性のために提供され、そしてcksumれるPOSIXによって指定し、このタイプの出力を許可していません。

この動作は2015年11月導入され、バージョン8.25(2016年1月)でリリースされ、次のNEWSエントリが含まれています。

md5sum行の先頭に「\」を使用し、改行を「\ n」に置き換えることにより、標準出力のステータスをファイルごとに1行にするようになりました。これも影響しsha1sumsha224sumsha256sumsha384sumsha512sum

行の先頭のバックスラッシュはフラグとして機能します。ファイル名のエスケープは、行がバックスラッシュで始まる場合にのみ処理されます。(エスケープ解除はデフォルトの動作にはなりません。保存されたファイル名を含む、\\または\n保存されたファイル内のCoreutilsの古いバージョンで生成された合計が壊れます。)


30
manしかし、このような完全に直感的ではないものがページに記載されていないのは残念です。(そして、はい、GNUは誰もが非常に複雑なinfoページを代わりに読むことを望んでいることを知っています。)
roaima

3
@msouth行の先頭のバックスラッシュは、ファイル名のバックスラッシュがエスケープであることを示すフラグとして機能します。そうしないと\n、リテラルまたはエスケープとして処理するかどうかなどわかりません。
スティーブンキット

3
それは、ファイル名の先頭にいた場合@msouthは、あなたはそれがフラグだかどうかを知る方法、あるいは純粋にバックスラッシュで始まるファイル名...得なかっました
スティーブン・キット

1
@StephenKitt曖昧さ回避のために先頭の\があるとは思わない。出力が常にバックスラッシュと改行をエスケープするものとして文書化されている場合、あいまいさはありません。必要がない場合は、エスケープを解除する必要はありません。もちろん、これが価値があるかどうかを議論することができます(個人的には価値がないと思いますが、私はcoreutils貢献者ではありません)。
TypeIA

1
ドキュメントの「ファイル名の問題のある各文字はバックスラッシュでエスケープされています」というフレーズは間違っています。改行をで置き換えることは、改行を\nバックスラッシュでエスケープすることと同じではありません!
-ruakh

17

スティーブン・キットの答えはをカバーしおりこの変更がなぜ実装されたのをカバーしようとします。最初に、改行1を含むファイル名があいまいな出力になる可能性があることを誰かが観察しました。たとえば、次の出力を検討してください。

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

これは、ファイルが2つfooありbar、ファイル名が1つだけのファイルがあることを意味します"foo\n25af89c92254a806b2e93fffd8ac1814 bar"か?確かに、この後者の可能性はほとんどありませんが、可能です。あいまいさを解決するために、開発者はバックスラッシュ(\)で改行をエスケープすることを選択しました。出力は区別可能になります。ただし、さらに曖昧さがあります。

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

このファイルの名前には改行が含まれていますnか?これを解決するには、バックスラッシュもエスケープする必要があるため、後者の場合は次のようになります。

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

最後に、このようなエスケープを含む各出力行の先頭にa \\を付けて、パーサーがエスケープが行われたかどうかを簡単に検出できるようにしました。これはおそらく、パーサーがエスケープバージョンmd5sumと非エスケープバージョン(非GNU)の両方からの出力を処理できるようにするために行われたものです。このフラグは、必要のないときに「コストのかかる」エスケープを解除する必要がないことも意味します。この解析md5sum.c自体の動作の例を見ることができます(リンクされたバージョンの行382)。


1により改行 I文字意味\n時には具体と呼ばれる改行またはLFを。をご覧くださいmd5sum.c


1
もちろん、正常な動作は、改行を含むすべてのファイルを完全に禁止することです。処理を拒否します。
パイプ

1
@pipeそれは非常識な振る舞いです。POSIXはそのようなファイル名を許可しますが、正当なファイルの使用を意図的に拒否するユーティリティは不良であり、火災で殺さなければなりません。
ルスラン

2
@Ruslan要点は、そのような反社会的な名前を許可することでPOSIXに抗議することです。そのような文字を許可すると、そのような特殊なケースを処理するためだけに大量のセキュリティ問題とコードの膨張が発生する可能性があります。
パイプ

@pipeファイル名のLFは確かに反社会的ですが、リンクで言及されている他のことは、スペース、非ラテン文字などのようにはるかに議論の余地があります。
Ruslan18年

エンジニアによる古典的なオーバーエンジニアリング。レッスン(まだ):エンジニアが要件を推進できないようにします。彼らは最も曖昧で複雑なケースを見つけ、それを支配的なケースに昇格させ、全員を混乱させます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.