Transferi recursivamente muitos arquivos e pastas scp
usando 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 scp
se cuida deles (por exemplo, exibe alguma mensagem de erro se algum arquivo não foi transferido corretamente)?
scp
e uma mensagem de erro associada ao stderr , ele terá copiado tudo corretamente e completamente.rsync
se 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.Respostas:
scp
verifica 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
scp
não esteja lhe dizendo que algo deu errado. Deve haver uma mensagem de erro, mas o indicador confiável é quescp
retorna um código de saída diferente de zero se algo der errado.Mais precisamente, você sabe que o arquivo foi transmitido corretamente se
scp
retornar 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. Sescp
retornar 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, comoscp
copia 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).
fonte
Eu nunca tive um problema com corrupção depois de
scp
algo, mas se você estiver preocupado com isso, sempre poderá executar osmd5sum <filename>
dois sistemas para garantir que eles sejam iguais.fonte
Por sugestão da @ david-king, esta é uma
md5
solução baseada em verificar a integridade dos arquivos após a transferência. Execute o seguinte comando uma vez depoiscd
ing a/source/folder
na máquina local e uma vez apóscd
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.Atualizar:
De acordo com esta resposta a uma pergunta semelhante no ServerFault ,(Verifique esta resposta por @Gilles para obter detalhes). Alternativa à verificação pós-transferência de hashes de arquivo, você pode usarscp
não garante a integridade do arquivorsync
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
fonte
scp
do código de retorno é suficiente, e verificar hashes é inútil.scp
retorne 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 usarscp
maisrsync
.