¿Debo verificar la corrupción del archivo una vez que scp haya terminado?

17

He transferido recursivamente muchos archivos y carpetas con scpel comando:

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

Después de que se complete la transferencia, ¿debo verificar si todos los archivos se transfirieron sin daños, o lo scpsoluciono (es decir, muestra algún mensaje de error si alguno de los archivos no se transfirió correctamente)?

Franck Dernoncourt
fuente
A menos que obtenga un estado de salida distinto de cero scpy un mensaje de error adjunto a stderr , habrá copiado todo de manera correcta y completa.
Roaima
un poco tl; dr a mi publicación: úsala rsyncsi puedes. Copia validaciones para cada archivo después de que una transacción ha finalizado, por lo que es una buena idea usar eso solo para estar un poco más seguro.
polemon

Respuestas:

24

scpverifica que copió todos los datos enviados por la otra parte. La integridad de la transferencia está garantizada por el protocolo de canal criptográfico. Por lo tanto, no necesita verificar la integridad después de la transferencia. Eso sería redundante y es muy poco probable que detecte algún error de hardware, ya que los datos con los que se compara probablemente se leerán de la memoria caché. Verificar datos periódicamente puede ser útil, pero verificar inmediatamente después de la transferencia no tiene sentido.

Sin embargo, debe asegurarse de que eso scpno le indique que algo salió mal. Debería haber un mensaje de error, pero el indicador confiable es que scpdevuelve un código de salida distinto de cero si algo salió mal.

Más precisamente, sabe que el archivo se transmitió correctamente si scpdevuelve 0 (es decir, el código de estado de éxito). Es necesario verificar que el estado de salida es 0 cuando ejecuta cualquier comando de todos modos. Si scpdevuelve un estado de error, o si una señal lo mata, o si nunca muere porque el sistema se bloquea o pierde energía mientras está en funcionamiento, entonces no tiene garantías. En particular, dado que scpcopia el archivo directamente a su nombre final, esto significa que puede terminar con un archivo parcial en caso de un bloqueo del sistema. Se garantiza que la parte que se copió es correcta, pero el archivo puede truncarse.

Para una mejor confiabilidad, use rsync en lugar de scp. A menos que se indique lo contrario, rsync escribe en un archivo temporal y lo coloca en su lugar una vez que ha terminado. Por lo tanto, si rsync devuelve un código de éxito, sabrá que el archivo está presente y una copia completa correcta; Si rsync no ha devuelto un código de error, no habrá ningún archivo presente (a menos que haya una versión anterior del archivo, en cuyo caso esa versión anterior no se modificará).

Gilles 'SO- deja de ser malvado'
fuente
3

Nunca he tenido un problema con la corrupción después de scpalgo, pero si te preocupa, siempre puedes ejecutar md5sum <filename>en ambos sistemas para asegurarte de que sean iguales.

David King
fuente
3

Según la sugerencia de @ david-king, esta es una md5solución basada para verificar la integridad de los archivos después de la transferencia. Ejecute el siguiente comando una vez después de cdque ING /source/folderen la máquina local y una vez después cding a /destination/folderen el host remoto: find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum. El hash resultante debe ser idéntico después de una transferencia exitosa.

Actualizar: De acuerdo con esta respuesta a una pregunta similar en ServerFault , scpno garantiza la integridad del archivo(Verifique esta respuesta de @Gilles para más detalles). Alternativa a la verificación posterior a la transferencia de los hashes de archivos, puede usar rsyncpara transferir archivos y verificar su código de retorno.

Actualización 2: lo siguiente solo verifica si los archivos y sus respectivos tamaños coinciden después de la transferencia:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum

Mani M
fuente
2
Si scp devuelve 0, se garantiza la integridad . Además, si scp no devuelve 0, entonces el problema no es la corrupción genérica sino específicamente el truncamiento; verificar el tamaño del archivo es suficiente (a menos que ya haya una versión anterior del archivo de destino: si scp se interrumpió muy temprano, la versión anterior aún podría estar presente). Verificar las sumas de verificación aquí es una pérdida de tiempo.
Gilles 'SO- deja de ser malvado'
Justa. Actualicé mi respuesta.
Mani M
No arreglaste la falla fundamental. Verificar scpel código de retorno es suficiente y verificar los hashes es inútil.
Gilles 'SO- deja de ser malvado'
1
Incluso si scpdevuelve 0 No garantiza que el sistema de archivos no ha ensuciado las cosas, por lo que la comprobación de los valores hash sigue siendo útil para comprobar la integridad de los datos sensibles si alguien decide utilizar scpmás rsync.
Mani M