単純な文字列、つまり「abc」のsha256を計算しようとしています。私は使用して発見しましたシャー256島次のユーティリティ:
sha256sum file_with_string
次の結果を提供します。
sha256sum # enter, to read input from stdin
abc
^D
今すぐ:
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb
終了信号が入力される前に、別の改行文字が標準入力に提供されることに注意してください。
最初に私を悩ませたのは、オンラインチェックサム電卓を使用してこれを確認することにしたときに結果が違っていたということです。
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
私の考えでは、これは私がstdinに入力した2番目の改行文字に関連しているようです。だから今回は^Dを2回挿入してみました(改行文字の代わりに)。結果は次のとおりです。
abcba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
もちろん、フォーマットが間違っていますが(改行がないため)、それ以外は上記と一致します。
後で、私はシェルの入力解析について明らかに理解していないことに気づきました。慎重に確認してみると、追加事項はありません新しいチームもともと指定したファイルにありますが、なぜこのような問題が発生しますか?
答え1
違いは改行文字です。まず、abc
sha256sumsの合計を収集しますabc\n
。
$ printf 'abc\n' | sha256sum
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb -
$ printf 'abc' | sha256sum
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad -
したがって、ba...ad
合計は文字列のもので、abc
1ed..cb
はのものですabc\n
。これで、ファイルに出力が表示されると、ed..cb
ファイルに改行文字があることを意味します。そして「テキストファイル」を考えると必要末尾の改行、新しいファイルを作成すると、ほとんどの編集者がファイルを追加します。
改行なしでファイルを取得するには、printf
上記の方法を使用してください。file
ファイルに改行文字がない場合は、警告が表示される方法を確認してください。
$ printf 'abc' > file
$ file file
file: ASCII text, with no line terminators
そして
$ printf 'abc\n' > file2
$ file file2
file2: ASCII text
今:
$ sha256sum file file2
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad file
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb file2
答え2
sha256sum # enter, to read input from stdin abc ^D
だから
^D
今回は(新しい行を使用する代わりに)2回挿入しようとしました。
ttyで^D
()を押すとVEOF
正式モード(すべてのコマンドラインウィンドウ、xtermなどのデフォルト)、ターミナルドライバ(「行ルール」)は、改行文字を待たずにすぐにバッファリングされたデータをttyから読み取るプロセスに使用できるようにします。
と入力するとabc
、後ろの文字列が読み込まれ(つまり、次に終わる)、後ろの空の文字列(つまり、サイズが0のコンテンツが読み込まれます)がファイルの終わりとして解釈されます。<newline>
^D
sha256sum
"abc\x0a"
LF
<newline>
""
^D
sha256sum
と入力するabc
と^D
二重、最初の文字列の後の文字列を読み取り、sha256sum
2番目の文字列の後の空の文字列をもう一度読みます。"abc"
^D
""
^D
したがって、前者の場合、出力に追加の改行文字が含まれ、チェックサムがsha256sum
異なります。
通常のファイルの場合、sha256sum
到達するまで読み取りが続きます。ファイルの終わり、ここで上記の2つの場合にのみ、読み取りは空の文字列を返します。sha256
入力が端末なのか、パイプなのか、普通のファイルなのか、まったくわからない状況も似ています。