He transferido recursivamente muchos archivos y carpetas con scp
el 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 scp
soluciono (es decir, muestra algún mensaje de error si alguno de los archivos no se transfirió correctamente)?
scp
y un mensaje de error adjunto a stderr , habrá copiado todo de manera correcta y completa.rsync
si 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.Respuestas:
scp
verifica 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
scp
no le indique que algo salió mal. Debería haber un mensaje de error, pero el indicador confiable es quescp
devuelve un código de salida distinto de cero si algo salió mal.Más precisamente, sabe que el archivo se transmitió correctamente si
scp
devuelve 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. Siscp
devuelve 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 quescp
copia 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á).
fuente
Nunca he tenido un problema con la corrupción después de
scp
algo, pero si te preocupa, siempre puedes ejecutarmd5sum <filename>
en ambos sistemas para asegurarte de que sean iguales.fuente
Según la sugerencia de @ david-king, esta es una
md5
solución basada para verificar la integridad de los archivos después de la transferencia. Ejecute el siguiente comando una vez después decd
que ING/source/folder
en la máquina local y una vez despuéscd
ing a/destination/folder
en 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 ,(Verifique esta respuesta de @Gilles para más detalles). Alternativa a la verificación posterior a la transferencia de los hashes de archivos, puede usarscp
no garantiza la integridad del archivorsync
para 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
fuente
scp
el código de retorno es suficiente y verificar los hashes es inútil.scp
devuelve 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 utilizarscp
másrsync
.