md5 ou sha1 ao copiar um arquivo

md5 ou sha1 ao copiar um arquivo

Existe uma maneira em qualquer distribuição Linux de realizar uma verificação md5sum ou sha1 enquanto o arquivo está sendo transferido de uma partição local para uma partição NFS?

Exemplo:

Eu tenho uma unidade montada em NFS e um arquivo muito grande na minha unidade local. Gostaria de transferir esse arquivo para a unidade montada em NFS e, ao mesmo tempo, fazer uma verificação MD5. Encontrei muitos scripts que fariam o md5 depois que o arquivo fosse copiado no drive remoto, mas como é um arquivo muito grande, 100GB+, gostaria de saber se há uma maneira de aproveitar o fato do arquivo já estar sendo vermelho durante a transferência.

Responder1

Não conheço um utilitário padrão do Linux que possa fazer isso. Se o arquivo coubesse em seu cache baseado em memória, não seria tão ineficiente fazer primeiro o md5sum e depois copiar (a cópia obteria os dados da memória).

Você pode usar a seguinte combinação:

cat filename | tee remote_output_name | md5sum

que você pode alterar para verificar diretamente a soma impressa em md5sumrelação ao md5 armazenado. Isso lê o arquivo do disco apenas uma vez.

Supondo que você tenha gerado um check.md5com

cd dir_with_big_files
md5sum * > check.md5

, o programa Python a seguir faria a cópia e verificação de um único arquivo, lendo/gravando em 64 MB por vez. Salve-o como /usr/local/bin/chkcopy chmod +x /usr/local/chkcopye chame-o comchkcopy 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)

Responder2

Existe um fork do conhecido ddcom funcionalidade estendida chamadodcflddque uso há anos ou uma ddversão corrigida chamadadc3ddcom funcionalidade um tanto semelhante.

Ambas as ferramentas podem realizar hash (mesmo com vários tipos de hash simultaneamente, se desejado) durante a cópia. Hashes podem ser calculados sobre pedaços e/ou todo o fluxo de dados.

algumas distros como o debian oferecem pacotes diretamente em seus repositórios, os pacotes para o fedora estão disponíveis através do servidor externorepositórios de certificadospor exemplo.

Para copiar um arquivo em pedaços de 8 MiB e calcular o MD5sum de todos os dados que é impresso em STDERR:

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

Para copiar um arquivo em pedaços de 8 MiB calculando o hash SHA256 de todos os dados mais a soma SHA256 em cada bloco de 64 MiB:

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

Um arquivo de saída para o hash calculado também pode ser fornecido especificando um arquivo por meio do hashlogparâmetro. Ao calcular vários hashes, saídas separadas podem ser especificadas por meio de, por exemplo md5log=FILE1.log sha256log=FILE2.log, .

Responder3

Você pode usar um programa externo ( crcsum), que estende cpe mvcom checksum:

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

informação relacionada