Bash

為什麼 sha256sum 對文件結束和輸入結束信號的處理方式不同?

  • October 24, 2020

我試圖為一個簡單的字元串計算 sha256,即“abc”。我發現像這樣使用sha256sum實用程序:

sha256sum file_with_string

給出與以下內容相同的結果:

sha256sum # enter, to read input from stdin
abc
^D

即:

edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb

請注意,在輸入結束信號之前,另一個換行符被饋送到標準輸入。


起初困擾我的是,當我決定使用線上校驗和計算器進行驗證時,結果有所不同:

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

我認為這可能與我提供給 stdin 的第二個換行符有關,所以這次我嘗試插入 ^D 兩次(而不是使用換行符),結果如下:

abcba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

現在,這當然格式不好(由於缺少換行符),但除此之外,它與上面的匹配。

在那之後,我意識到我顯然無法理解 shell 中的輸入解析。我仔細檢查了我最初指定的文件中沒有多餘的換行符,那麼為什麼我會遇到這種行為?

不同之處在於換行符。abc首先,讓我們收集和的 sha256sums abc\n

$ printf 'abc\n' | sha256sum 
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb  -
$ printf 'abc' | sha256sum 
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad  -

所以,ba...ad總和是針對字元串的abc,而ed..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

引用自:https://unix.stackexchange.com/questions/613843