md5sum выводит только хеш в файл

Привет, я хочу создать bash-файл на linux, который проверяет хэш md5 файла по резервному хешу md5, так что я знаю, был ли подделан исходный файл. Сценарий должен вывести хэш md5 из двух файлов, а затем сравнить два созданных хеш-файла:

md5sum file1 > file1.md5 | cut -c -32
if [ file1.md5 =! backup.md5 ] then;
   #send email

но это не работает, в файле.md5 все еще есть имя файла, кто-то знает, как получить только файл.md5?

4 ответа

Решение

Есть несколько проблем с вашим скриптом.

Сначала вы подаете заявку cut -c -32 после того, как вы уже перенаправили вывод md5sum в file1.md5, поэтому он ничего не делает.

Вы должны реструктурировать это так:

md5sum file1 | cut -c -32 > file1.md5

Далее вы не можете реально сравнить файлы с =! вместо этого вы должны прочитать и сравнить их содержимое, например так:

[ "$(cat file1.backup.md5)" != "$(cat file1.real.md5)" ]

Также обратите внимание, что md5sum уже есть "режим проверки", так что вы можете просто сделать это:

#Save MD5 sum of your file to backup.md5, in md5sum native format
md5sum file1 > backup.md5

#Later on ...
if ! md5sum -c backup.md5; then
...

Re: "есть еще имя файла в md5 [строка], ... как получить только хеш?"

Строка, которая md5sum return - это (или, по крайней мере, по структуре) запись с двумя полями или кортеж с двумя элементами. Например,

$ md5sum filename.txt 8d7dd71ff51614e69339b03bd1cb86ac filename.txt

Чтобы получить только хеш (первое поле / элемент), попробуйте передать строку в awk следующим образом:

$ md5sum filename.txt | awk '{print $1}' 8d7dd71ff51614e69339b03bd1cb86ac

Я отправляю этот ответ на эту конкретную часть вопроса ОП, заданного более года назад для тех, кто работает над аналогичными проблемами и наткнулся на эту тему, как и я.

У вас неправильный порядок команд. Написать

md5sum file1 | cut -c -32 > file1.md5

Труба находится в неправильном положении. Используйте так:

 md5sum file1| cut -c -32 > file1.md5

Или для полной реализации без сохранения сумм md5 в файлы:

ORG_SUM=`md5sum org_file | cut -c -32`
BCK_SUM=`md5sum bck_file | cut -c -32`
if [ "${ORG_SUM}" != "${BCK_SUM}" ]; then
   #send email
fi
Другие вопросы по тегам