md5 ou sha1 ao copiar um arquivo

2

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

Exemplo:

Eu tenho uma unidade montada em NFS e um arquivo muito grande na minha unidade local. Eu gostaria de transferir esse arquivo para a unidade montada NFS e, ao mesmo tempo, fazer uma verificação md5. Eu encontrei um monte de scripts que faria o md5 depois que o arquivo foi copiado na unidade remota, mas desde que é um arquivo muito grande 100GB + eu gostaria de saber se há uma maneira de tirar proveito do fato de que o arquivo já está sendo vermelho ao ser transferido.

    
por Oktav 18.10.2013 / 10:04

3 respostas

4

Não tenho conhecimento de um utilitário padrão do Linux que possa fazer isso. Se o arquivo couber 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 por md5sum no md5 armazenado. Isso lê o arquivo do disco apenas uma vez.

Supondo que você gerou um check.md5 com

cd dir_with_big_files
md5sum * > check.md5

, o seguinte programa do Python faria a cópia e a verificação de um único arquivo, lendo / gravando em 64 MB de cada vez. Salve como / usr / local / bin / chkcopy, chmod +x /usr/local/chkcopy e chame-o com chkcopy 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)
    
por 18.10.2013 / 12:38
1

Você pode usar o programa externo ( crcsum ), que estende cp e mv com a soma de verificação:

link

    
por 07.10.2014 / 20:16
0

Existe uma bifurcação do bem conhecido dd com funcionalidade estendida chamada dcfldd que venho usando há anos ou um dd -version corrigido chamado dc3dd com funcionalidade semelhante.

Ambas as ferramentas podem executar o hash (mesmo com vários tipos de hash simultaneamente, se desejado) durante a cópia. Os hashes podem ser calculados em partes e / ou todo o fluxo de dados.

algumas distribuições como o debian oferecem pacotes diretamente em seus repositórios, pacotes para o fedora estão disponíveis por meio dos certificados-repositórios externos, por exemplo.

Para copiar um arquivo em blocos 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 blocos de 8MiB, calculando o hash SHA256 do dado inteiro mais o SHA256sum sobre cada bloco de 64MiB:

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 através do parâmetro hashlog . Ao calcular múltiplos hashes, saídas separadas podem ser especificadas através de, e. md5log=FILE1.log sha256log=FILE2.log .

    
por 12.02.2018 / 09:32