Preciso checar a corrupção do arquivo quando o scp é feito?

15

Eu transferi recursivamente muitos arquivos e pastas com scp , usando o comando:

scp -rp /source/folder [email protected]:/destination/folder

Após a conclusão da transferência, eu preciso verificar se todos os arquivos foram transferidos sem qualquer dano, ou o scp cuida disso (isto é, exibe alguma mensagem de erro se algum arquivo não for transferido corretamente)?

    
por Franck Dernoncourt 04.01.2016 / 20:41

3 respostas

21

scp verifica se copiou todos os dados enviados pela outra parte. A integridade da transferência é garantida pelo protocolo do canal criptográfico. Então você não precisa verificar a integridade após a transferência. Isso seria redundante e muito improvável de detectar qualquer erro de hardware, pois os dados comparados provavelmente seriam lidos do cache. Verificar os dados periodicamente pode ser útil, mas verificar imediatamente após a transferência é inútil.

No entanto, você precisa garantir que scp não esteja dizendo que algo deu errado. Deve haver uma mensagem de erro, mas o indicador confiável é que scp retorna um código de saída diferente de zero se algo deu errado.

Mais precisamente, você sabe que o arquivo foi transmitido corretamente se scp retornar 0 (ou seja, o código de status de sucesso). Verificando se o status de saída é 0 é necessário quando você executa qualquer comando de qualquer maneira. Se scp retornar um status de erro, ou se for morto por um sinal, ou se nunca morrer porque o sistema trava ou perde energia enquanto está em execução, você não tem garantias. Em particular, como scp copia o arquivo diretamente para seu nome final, isso significa que você pode acabar com um arquivo parcial em caso de falha do sistema. A parte que foi copiada tem a garantia de estar correta, mas o arquivo pode estar truncado.

Para melhor confiabilidade, use rsync em vez de scp. A menos que seja instruído de outra forma, o rsync grava em um arquivo temporário e o move para o lugar quando ele é concluído. Assim, se o rsync retornar um código de sucesso, você sabe que o arquivo está presente e uma cópia completa e correta; Se o rsync não retornou um código de erro, nenhum arquivo estará presente (a menos que houvesse uma versão mais antiga do arquivo, caso em que a versão mais antiga não será modificada).

    
por 05.01.2016 / 02:09
3

Eu nunca tive um problema com corrupção depois de scp , mas se você está preocupado com isso, sempre pode executar md5sum <filename> em ambos os sistemas para garantir que sejam iguais.

    
por 04.01.2016 / 20:49
3

Por sugestão de @ david-king, esta é uma solução baseada em md5 para verificar a integridade dos arquivos após a transferência. Execute o seguinte comando uma vez depois de cd ing para /source/folder na máquina local e uma vez após cd ing para /destination/folder no host remoto: find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum . O hash resultante deve ser idêntico após uma transferência bem sucedida.

Atualização: De acordo com esta resposta a uma pergunta semelhante sobre > ServerFault , scp não garante a integridade do arquivo (Por favor, verifique esta resposta por @Gilles para detalhes). Alternativa à verificação pós-transferência de hashes de arquivos, você pode usar rsync para transferir arquivos e verificar seu código de retorno.

Atualização 2: O seguinte apenas verifica se os arquivos e seus respectivos tamanhos correspondem após a transferência: find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum

    
por 04.01.2016 / 21:48

Tags