Cuando queremos transferir archivos entre computadoras, utilizamos algún tipo de protocolo como puede ser HTTP (al descargar un archivo de la web) o FTP.
Cuando queremos transferir archivos de forma SEGURA, utilizamos el protocolo SCP, que está basado en SSH y permite utilizar criptografía de llave pública para mantener seguras las conexiones.
Uno de los problemas típicos, es cuando la conexión entre las dos computadoras se corta, y las transferencias quedan interrumpidas. La cuestión es, ¿qué tal que era un archivo enorme de 10GB y se quedo a la mitad del camino, o peor aún, estaba por terminar? Pues con scp no hay modo de reanudar la transferencia y se tiene que reiniciar
El problema empeora cuando intentamos hacer una copia de un directorio con múltiples archivos (y posiblemente más directorios) y entonces la conexión se interrumpe.
#Caso 1: copiando un directorio con todo su contenido scp -r midirectorio usuario@servidor:~/
#Caso 2: copiando sólo los archivos de un directorio dado scp midirectorio/* usuario@servidor:~/destino/
En ambos casos, si la conexión se interrumpe, e intentamos repetir el comando, la copia comienza desde cero otra vez. Algunos pensaremos… “pues verifico que cosas se copiaron y que cosas no, y entonces repito el comando sólo para lo que no se copió”. Bueno, ¿y si el directorio tenía 10000 fotografías y otros 100 subdirectorios con más contenido? ¿Voy a seleccionar uno por uno? Creo que no es la mejor opción.
Una derivación de este último caso, es cuando tenemos un directorio que deseamos copiar digamos cada semana. Por ejemplo, hacer una copia de seguridad de un sitio web cada semana en otra computadora. Si lo hacemos con scp, cada semana hay que copiar el directorio COMPLETO. ¿Por qué desperdiciar todo ese ancho de banda?
Un caso similar, es cuando hacemos una copia de un archivo muy grande y por algún motivo DEBEMOS interrumpir la copia. Tenemos que empezar nuevamente si usamos scp. Esto no es conveniente.
Bueno, la solución está en el comando rsync que nos permite realizar copias incrementales y reanudar transferencias. No hasta hace mucho lo conocí en persona, a pesar de que ya había escuchado de él y muchas veces me encontré con los problemas mencionados.
El comando que utilizo es el siguiente:
rsync -avzP midirectorio usuario@servidor:~/directoriodestino
A grandes rasgos, cada flag significa los siguiente:
- -a : Básicamente hará una copia recursiva del directorio preservando lso atributos de cada archivo.
- -v : El famoso flag “verbose” para ver con mayor detalle lo que está ocurriendo durante la ejecución.
- -z : Usar compresión. Muy útil para cuando el ancho de banda es escaso y se transmiten archivos de texto.
- -P : Es la combinación de dos flags –progress y –partial. La primera, es para mostrar el progreso de la transferencia, y la segunda, y más importante, permite reanudar la transferencia desde un archivo “parcial” o incompleto si es que existe. Esto lo hace verificando el tamaño y la fecha de modificación de ambos archivos.
Hagan sus pruebas, y espero les sirva de algo este pequeño artículo. Cualquier error, háganmelo saber.
Pingback: Cambiando el puerto de rsync - Tech SurveyorTech Surveyor
¡Que grande sos! Tenia que migrar un sitio de 30GB lo estaba haciendo por ssh y se me corto a la mitad. Me salvaste la vida con este comando GENIO!