md5 oder sha1 beim Kopieren einer Datei

md5 oder sha1 beim Kopieren einer Datei

Gibt es in einer beliebigen Linux-Distribution eine Möglichkeit, eine MD5SUM- oder SHA1-Prüfung durchzuführen, während die Datei von einer lokalen Partition auf eine NFS-Partition übertragen wird?

Beispiel:

Ich habe ein per NFS gemountetes Laufwerk und eine sehr große Datei auf meinem lokalen Laufwerk. Ich möchte diese Datei auf das per NFS gemountete Laufwerk übertragen und gleichzeitig eine MD5-Prüfung durchführen. Ich habe viele Skripte gefunden, die die MD5-Prüfung durchführen, nachdem die Datei auf das Remote-Laufwerk kopiert wurde, aber da es sich um eine sehr große Datei (über 100 GB) handelt, würde ich gerne wissen, ob es eine Möglichkeit gibt, die Tatsache auszunutzen, dass die Datei bereits während der Übertragung gelesen wird.

Antwort1

Mir ist kein Standard-Linux-Dienstprogramm bekannt, das dies kann. Wenn die Datei in Ihren speicherbasierten Cache passen würde, wäre es nicht so ineffizient, zuerst die MD5-Summe zu berechnen und dann zu kopieren (beim Kopieren würden die Daten aus dem Speicher abgerufen).

Sie können folgende Kombination verwenden:

cat filename | tee remote_output_name | md5sum

Dies können Sie möglicherweise ändern, um die ausgegebene Summe direkt md5summit dem gespeicherten MD5 zu vergleichen. Dadurch wird die Datei nur einmal von der Festplatte gelesen.

Angenommen, Sie haben eine generiert check.md5mit

cd dir_with_big_files
md5sum * > check.md5

, das folgende Python-Programm würde das Kopieren und Prüfen einer einzelnen Datei durchführen und dabei jeweils 64 MB lesen/schreiben. Speichern Sie es als /usr/local/bin/chkcopy chmod +x /usr/local/chkcopyund rufen Sie es mitchkcopy file_name check.md5 destination_filename_or_dir

#! /usr/bin/env python

import sys, os, hashlib

m = hashlib.md5()
file_name = sys.argv[1]
md5_name = sys.argv[2]
out_name = sys.argv[3]
if os.path.isdir(out_name):
    out_name = os.path.join(out_name, file_name)
BUF_SIZE = 64 * (1024 ** 2)

with open(file_name, 'rb') as ifp:
    with open(out_name, 'wb') as ofp:
        buf = ifp.read(BUF_SIZE)
        while buf:
            m.update(buf)
            ofp.write(buf)
            buf = ifp.read(BUF_SIZE)
with open(md5_name) as fp:
    for line in fp:
        md5, fn = line.rstrip().split('  ', 1)
        if fn == file_name:
            assert m.hexdigest() == md5
            break
    else:
        print('no md5 found for ' + file_name)

Antwort2

Es gibt einen Fork des bekannten ddmit erweiterter Funktionalität namensdcfldddie ich seit Jahren benutze oder eine gepatchte ddVersion namensdc3ddmit etwas ähnlicher Funktionalität.

Beide Tools können während des Kopierens Hashes durchführen (auf Wunsch auch mit mehreren Hash-Typen gleichzeitig). Hashes können über Chunks und/oder den gesamten Datenstrom berechnet werden.

Einige Distributionen wie Debian bieten Pakete direkt in ihren Repositories an, Pakete für Fedora sind über das externeZertifikat-RepositorysZum Beispiel.

So kopieren Sie eine Datei in 8-MiB-Blöcken und berechnen die MD5-Summe der gesamten Daten, die auf STDERR ausgegeben wird:

dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile

So kopieren Sie eine Datei in 8-MiB-Blöcken und berechnen den SHA256-Hash der gesamten Daten sowie die SHA256-Summe über jeden 64-MiB-Block:

dcfldd if=/path/to/input bs=8M hash=SHA256 hashwindow=64M of=/path/to/outputfile

Eine Ausgabedatei für den berechneten Hash kann auch bereitgestellt werden, indem eine Datei über den hashlogParameter angegeben wird. Bei der Berechnung mehrerer Hashes können separate Ausgaben beispielsweise über angegeben werden md5log=FILE1.log sha256log=FILE2.log.

Antwort3

Sie können ein externes Programm () verwenden crcsum, das cpund mvmit Prüfsumme erweitert:

https://sourceforge.net/projects/crcsum/

verwandte Informationen