Как автоматизировать сравнение хеш-значений md5sum для большого количества файлов

28

Я могу проверить хеш md5sum файла из терминала, как,

$ md5sum my_sensitive_file
8dad53cfc973c59864b8318263737462 my_sensitive_file

Но сложная часть состоит в том, чтобы сравнить хеш-значение с точным.

Трудно сравнить выводимые 32 символа с оригинальным / точным значением хеша любым человеком для большого количества файлов. Прежде всего, работа будет очень однообразной, и в ней будет много ошибок.

Можно ли автоматизировать процесс сравнения, предпочтительно в CLI?

souravc
источник

Ответы:

39

Например, у меня есть файл с именем test_binary.

MD5 сумма файла теста ef7ab26f9a3b2cbd35aa3e7e69aad86c

Чтобы проверить это автоматически, запустите это:

$ md5sum -c <<<"ef7ab26f9a3b2cbd35aa3e7e69aad86c *path/to/file/test_binary"
test_binary: OK

или

$ echo "595f44fec1e92a71d3e9e77456ba80d1  filetohashA.txt" | md5sum -c -

Цитата из человека

   -c, --check
          read MD5 sums from the FILEs and check them

Цитата из вики

Примечание. Между каждым значением md5sum и именем файла должно быть два пробела для сравнения. В противном случае возникнет следующая ошибка: «не найдены правильно отформатированные строки контрольной суммы MD5».

Ссылка на вики

Также вы можете просто прочитать хэши md5 из файла

$ md5sum -c md5sum_formatted_file.txt

Ожидается файл с форматом:

<md5sum_checksum><space><space><file_name>

Около *и <space>после MD5 сумма хеша. В человеке мало заметки:

 When  checking,  the
       input  should  be a former output of this program.  The default mode is
       to print a line with checksum, a character indicating input  mode  ('*'
       for binary, space for text), and name for each FILE.

А вот ссылка на stackoverflow, где я нашел ответ на вопрос, почему мы иногда должны различать binaryфайлы и textфайлы.


c0rp
источник
3
Нужна ли звездочка?
Jobin
Интересный вопрос. Я всегда использую с *, но вики сказал, что это должно быть два пробела. Я буду искать ...
crrp
@souravc хорошо, я нашел информацию о *, скоро
обновлю
@ Jobin Я добавляю информацию *в ответ
crrp
В этом есть смысл. Добавили +1
Jobin
2

Одна возможность - использовать утилиту cfv.

sudo apt-get install cfv

CFV поддерживает много типов хэшей, а также тестирование и создание хеш-файлов.

# List the files
$ ls
test.c
# Create a hash file
$ cfv -tmd5 -C
temp.md5: 1 files, 1 OK.  0.001 seconds, 302.7K/s
# Test the hash file
$ cfv -tmd5 -T
temp.md5: 1 files, 1 OK.  0.001 seconds, 345.1K/s
# Display the hash file
$ cat *.md5
636564b0b10b153219d6e0dfa917d1e3 *test.c
Эллиот Фриш
источник
1
спасибо за ваш ответ, но для этого нужно установить другую утилиту. В то же время он обеспечивает поддержку и в другом формате. Это полезно знать об этом. Но в данном контексте я пойду с другим ответом. В любом случае +1 от меня.
souravc
1

Да, *для этой команды требуется звездочка . Посмотрите на этот пример.

Это двоичный файл, и допустим, правильное значение md5sum равно exampleofcorrectmd5value00000000(32 шестнадцатеричного символа)

[root@Linux update]# ls -lh
total 137M
-rw-r--r-- 1 root root 137M Nov  5 13:01 binary-file.run.tgz
[root@Linux update]# 

-c, --check

читать суммы MD5 из файлов и проверять их

Если значение md5sum совпадает с двоичным файлом, вы получите этот вывод

[root@Linux ~]# md5sum -c <<< "exampleofcorrectmd5value00000000" *binary-file.run.tgz"
binary-file.run.tgz: OK
[root@Linux ~]# 

И это когда значение md5sum не совпадает

[root@Linux update]# md5sum -c <<< "exampleofwrongmd5value0000000000 *binary-file.run.tgz"
binary-file.run.tgz: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match
[root@Linux update]# 

Без звездочки *вы получите следующее сообщение об ошибке, даже если значение md5 верное

[root@Linux ~]# md5sum -c <<< "exampleofcorrectmd5value00000000 binary-file.run.tgz" 
md5sum: standard input: no properly formatted MD5 checksum lines found
[root@Linux ~]# 

Кроме того, вы получите то же сообщение об ошибке, если в md5sum нет 32 шестнадцатеричных символов. В этом примере это всего 31 символ.

[root@Linux ~]# md5sum -c <<< "exampleofmd5valuelessthan32char *binary-file.run.tgz" 
md5sum: standard input: no properly formatted MD5 checksum lines found
[root@Linux ~]# 

Решение для многих файлов

Если у вас много файлов и вы хотите автоматизировать процесс, вы можете выполнить следующие действия:

user@Ubuntu:~$ ls -lh
total 12K
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-a
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-b
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-c
user@Ubuntu:~$ 

Сгенерируйте md5sum для каждого файла и сохраните его в md5sum.txt.

user@Ubuntu:~$ md5sum * | tee md5sum.txt
0bee89b07a24ae27c83fc3d5951213c1  file-a
1b2297c171a9a450d184871ccf6c9ad4  file-b
7f4d13d9b0b6ac086fd68637067435c5  file-c
user@Ubuntu:~$ 

Чтобы проверить md5sum для всех файлов, используйте следующую команду.

user@Ubuntu:~$ md5sum -c md5sum.txt 
file-a: OK
file-b: OK
file-c: OK
user@Ubuntu:~$ 

Это пример, если значение md5sum не совпадает с файлом. В этом случае я собираюсь изменить file-bсодержание

user@Ubuntu:~$ echo "new data" > file-b 
user@Ubuntu:~$ 

Видите, это сообщение об ошибке. Надеюсь это поможет.

user@Ubuntu:~$ md5sum -c md5sum.txt 
file-a: OK
file-b: FAILED
file-c: OK
md5sum: WARNING: 1 computed checksum did NOT match
user@Ubuntu:~$ 
Шарлотта Рассел
источник