Preciso verificar se há corrupção de arquivo após a conclusão do scp?

17

Transferi recursivamente muitos arquivos e pastas scpusando o comando:

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

Após a conclusão da transferência, preciso verificar se todos os arquivos foram transferidos sem qualquer corrupção ou scpse cuida deles (por exemplo, exibe alguma mensagem de erro se algum arquivo não foi transferido corretamente)?

Franck Dernoncourt
fonte
A menos que você obtenha um status de saída diferente de zero scpe uma mensagem de erro associada ao stderr , ele terá copiado tudo corretamente e completamente.
amigos estão dizendo sobre roaima
um pouco tl; dr para o meu post: use rsyncse puder. Ele copia validações para todos os arquivos após o término de uma transação, por isso é uma boa ideia usá-lo apenas para ser um pouco mais seguro.
precisa saber é

Respostas:

24

scpverifica se copiou todos os dados enviados pela outra parte. A integridade da transferência é garantida pelo protocolo de canal criptográfico. Portanto, você não precisa verificar a integridade após a transferência. Isso seria redundante e muito improvável que ocorra algum erro de hardware, pois os dados com os quais você está comparando provavelmente serão lidos no cache. Verificar dados periodicamente pode ser útil, mas verificar imediatamente após a transferência não faz sentido.

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

Mais precisamente, você sabe que o arquivo foi transmitido corretamente se scpretornar 0 (ou seja, o código de status de sucesso). Verificar se o status de saída é 0 é necessário quando você executa qualquer comando. Se scpretornar um status de erro, ou se ele 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 scpcopia o arquivo diretamente para seu nome final, isso significa que você pode acabar com um arquivo parcial no caso de uma falha no sistema. A parte que foi copiada é garantida como correta, mas o arquivo pode estar truncado.

Para melhor confiabilidade, use rsync em vez de scp. A menos que instruído de outra forma, o rsync grava em um arquivo temporário e o move para o lugar quando terminar. Portanto, se o rsync retornar um código de sucesso, você saberá que o arquivo está presente e uma cópia correta e completa; se o rsync não tiver retornado um código de erro, nenhum arquivo estará presente (a menos que haja uma versão mais antiga do arquivo; nesse caso, essa versão mais antiga não será modificada).

Gilles 'SO- parar de ser mau'
fonte
3

Eu nunca tive um problema com corrupção depois de scpalgo, mas se você estiver preocupado com isso, sempre poderá executar os md5sum <filename>dois sistemas para garantir que eles sejam iguais.

David King
fonte
3

Por sugestão da @ david-king, esta é uma md5solução baseada em verificar a integridade dos arquivos após a transferência. Execute o seguinte comando uma vez depois cding a /source/folderna máquina local e uma vez após cding para /destination/folderno 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.

Atualizar: De acordo com esta resposta a uma pergunta semelhante no ServerFault , scpnão garante a integridade do arquivo(Verifique esta resposta por @Gilles para obter detalhes). Alternativa à verificação pós-transferência de hashes de arquivo, você pode usar rsyncpara 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

Mani M
fonte
2
Se scp retornar 0, a integridade será garantida. Além disso, se o scp não retornar 0, o problema não é corrupção genérica, mas especificamente truncamento; verificar o tamanho do arquivo é suficiente (a menos que já exista uma versão mais antiga do arquivo de destino: se o scp for interrompido muito cedo, a versão mais antiga ainda poderá estar presente). Verificar somas de verificação aqui é uma perda de tempo.
Gilles 'SO- stop be evil'
Justo. Eu atualizei minha resposta.
Mani M
Você não consertou a falha fundamental. Verificação scpdo código de retorno é suficiente, e verificar hashes é inútil.
Gilles 'SO- stop be evil'
1
Mesmo que scpretorne 0, não garante que o sistema de arquivos não tenha estragado tudo, portanto a verificação dos hashes ainda é útil para verificar a integridade dos dados confidenciais se alguém optar por usar scpmais rsync.
Mani M