Jak zautomatyzować porównanie wartości skrótu md5sum dla dużej liczby plików

28

Mogę sprawdzić skrót md5sum pliku z terminala, ponieważ:

$ md5sum my_sensitive_file
8dad53cfc973c59864b8318263737462 my_sensitive_file

Ale trudną częścią jest porównanie wartości skrótu z dokładną.

Trudno jest porównać 32-znakowy wynik wyjściowy z oryginalną / dokładną wartością skrótu dla każdego człowieka dla dużej liczby plików. Przede wszystkim praca byłaby bardzo monotonna i istnieje duży zakres błędów.

Czy można zautomatyzować proces porównywania, najlepiej w interfejsie CLI?

souravc
źródło

Odpowiedzi:

39

Na przykład mam plik o nazwie test_binary.

Suma MD5 testu pliku wynosi ef7ab26f9a3b2cbd35aa3e7e69aad86c

Aby przetestować, uruchom automatycznie:

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

lub

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

Cytat od człowieka

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

Cytat z wiki

Uwaga: muszą być dwie spacje między każdą wartością md5sum a nazwą pliku do porównania. W przeciwnym razie pojawi się następujący błąd: „nie znaleziono poprawnie sformatowanych wierszy sumy kontrolnej MD5”.

Link do wiki

Możesz także po prostu odczytać skróty md5 z pliku

$ md5sum -c md5sum_formatted_file.txt

Oczekuje pliku w formacie:

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

Informacje o skrócie sum MD5 *i <space>po nim. W człowieku jest niewiele notatek:

 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.

I tutaj jest link do stackoverflow, gdzie znalazłem odpowiedź na pytanie, dlaczego czasami powinniśmy rozróżniać binarypliki i textpliki.


c0rp
źródło
3
Czy gwiazdka jest konieczna?
jobin
Interesujące pytanie. Zawsze używam z *, ale wiki powiedziała, że ​​powinny to być dwie spacje. Będę szukać ...
c0rp
@souravc ok, znalazłem informacje o *, wkrótce zaktualizuję
c0rp
@Jobin Dodam informacje *do odpowiedzi
c0rp
To ma sens. +
1'd
2

Jedną z możliwości jest użycie narzędzia cfv

sudo apt-get install cfv

CFV obsługuje wiele rodzajów skrótów oraz testowanie i tworzenie plików skrótów.

# 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
Elliott Frisch
źródło
1
dziękuję za odpowiedź, ale trzeba zainstalować inne narzędzie. Jednocześnie zapewnia obsługę innych formatów. Warto o tym wiedzieć. Ale w obecnym kontekście pójdę z inną odpowiedzią. W każdym razie +1 ode mnie.
souravc
1

Tak, gwiazdka *jest wymagana dla tego polecenia. Spójrz na ten przykład.

To jest plik binarny i powiedzmy, że poprawna wartość md5sum to exampleofcorrectmd5value00000000(32 znaki szesnastkowe)

[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

odczytać sumy MD5 z PLIKÓW i sprawdzić je

Jeśli wartość md5sum zgadza się z plikiem binarnym, otrzymasz to wyjście

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

I wtedy wartość md5sum nie pasuje

[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]# 

Bez gwiazdki *pojawi się następujący komunikat o błędzie, nawet jeśli wartość md5 jest poprawna

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

Otrzymasz również ten sam komunikat o błędzie, jeśli md5sum nie zawiera 32 znaków szesnastkowych. W tym przykładzie ma tylko 31 znaków.

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

Rozwiązanie dla wielu plików

Jeśli masz wiele plików i chcesz zautomatyzować proces, możesz wykonać następujące kroki:

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:~$ 

Wygeneruj md5sum dla każdego pliku i zapisz go w md5sum.txt

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

Aby sprawdzić md5sum dla wszystkich plików, użyj następującego polecenia.

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

Jest to przykład, jeśli wartość md5sum nie pasuje do pliku. W takim przypadku zamierzam zmodyfikować file-btreść

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

Widzisz, to jest komunikat o błędzie. Mam nadzieję że to pomoże.

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:~$ 
Charlotte Russell
źródło