sábado, 24 de febrero de 2018

Comando rsync para sistemas Linux equivalente al comando robocopy en Windows



Hola buenas señores.

Cuando usaba el sistema operativo Windows y necesitaba hacer una serie de copias de varios archivos de una ubicación a otra utilizaba un comando que se llama "robocopy".
Este comando era bastante completito y servía para hacer copias comparando los archivos del directorio destino con el directorio origen para solo hacer copias de los archivos modificados y archivos nuevos.

Pues bien, necesitaba un comando que me hiciera la misma función pero en el sistema operativo GNU/Linux.


Si existe en Windows como no va a existir un comando que haga la misma tarea o mejor en Linux.

Y he encontrado "rsync", que además de poder copiar archivos y directorios desde dos ubicaciones diferentes de una misma máquina, también permite sincronizar archivos y directorios entre dos máquinas de una red. Opera también con datos comprimidos y cifrados.
Una autentica gozada, Linux no deja nunca de sorprenderme.

Vamos al lio amigos, empezaremos con una pequeña prueba, una copia de archivos entre dos ubicaciones en mi computadora. Abrimos un terminal de comandos con la combinación de teclas "Ctrl" mas "Alt" mas "T" y escribiremos la siguiente sintaxis:

$ rsync -avzh /home/belinux/OrigenPrueba/ /home/belinux/DestinoPrueba/


Con el anterior comando hemos copiado todos los archivos del directorio /OrigenPrueba en el directorio /DestinoPrueba.
Con una serie de opciones que os voy a explicar:

-a  esta opción es igual que elegir todas estas opciones juntas -rlptgoD; donde:
             -r recursividad dentro de los directorios, significa que va a copiar, todos
                 los archivos y subdirectorios de dentro del directorio
                 principal que hemos elegido a copiar.

             -l copiará los enlaces simbólicos y los mantendrá al directorio
                 destino.

             -p preserva los permisos de los archivos que ha copiado.


             -t preserva la modificación de la hora de los archivos
                 copiados. Esto le dice a rsync que transfiera los
                 tiempos de modificación junto con los archivos y los
                 actualice en el sistema remoto.
          
             -g preserva los grupos de los archivos copiados.
            
             -o preserva el propietario de los archivos copiados.

             -D preserva los archivos especiales.

-v esta opción aumenta la cantidad de información que nos proporciona durante la transferencia de los archivos. Una sola -v quiere darnos información sobre qué archivos se transfieren y un breve resumen al final. Las dos opciones de -v (escribir -vv) nos darán información sobre qué archivos se saltan y un poco más de información al final.

-z con esta opción, reduce la cantidad de datos que se transmiten, lo cual es útil en una conexión lenta.

-h con esta opción hacemos que los números de tamaño o capacidad de los archivos trasladados sean legibles para los humanos. Las letras de la unidad se anexan en los niveles 2 y 3 son: K (kilo), M (mega), G (giga) o T (tera). Por ejemplo, un archivo de 1234567 Bytes produciría como 1.23MB en el nivel 2.

Hay muchísimas mas opciones a testear, pero estas que os muestro son las principales para poder copiar archivos de una unidad origen a una unidad destino donde comparará los archivos y solo copiará los modificados o nuevos, disminuyendo el proceso de copia o traspaso.

En otro ejemplo, he creado un script donde siempre que lo ejecute me comparará y copiará solamente los archivos nuevos y modificados entre dos unidades de almacenamiento externo. Uno es un pendrive y el otro un disco duro externo.

Este es el script guardado con el nombre "copiaArchivos.sh":

 #!/bin/bash

clear
echo "COPIA DE ARCHIVOS DESDE EL LAPIZ AL DISCO DURO EXTERNO"
echo
rsync -avzh /media/belinux/TRANSCEND /media/belinux/ADATA\ HV610/copiaPrueba/
echo "FIN DE COPIA"


Si os fijáis en el comando rsync, las opciones son las detalladas anteriormente, seguidamente nombrando el directorio origen de la copia y mención especial al directorio origen, fijaros que NO hago terminar con una barra inclinada (/) el directorio origen "/TRANSCEND", gracias a la NO escritura de esta barra inclinada al final del directorio se va a crear en la unidad destino el directorio "/TRANSCEND" con todos sus archivos y subdirectorios. Ojo con esto, si termináis una ruta de origen con una barra inclinada NO se os creará este último directorio. Pero el tema cambia para el directorio de destino "/copiaPrueba/", tanto si le escribo como si no la barra inclinada (/) al final del mismo, se creará si no existe este directorio, en cambio no se duplicará si ya existe. Ojo con esto, haced vuestras pruebas antes por si no me explico bien.

Y en la siguiente imagen el resultado de ejecutar este script:



Si en el ejemplo de prueba anterior añado un archivo al directorio origen, modifico otro y vuelvo a hacer una copia veréis que sucede:


He añadido un archivo con el nombre "foto1.png" y he modificado el contenido del archivo "comprobar parche kernel" y por tanto solamente se han copiado estos dos archivos al directorio destino.

En el caso de no querer copiar un subdirectorio escribiremos la opción --exclude, por ejemplo en la operación de copia anterior, no quiero copiar el directorio "/System Volume Information", voy a cambiar la sentencia del comando "rsync" en mi script, quedando de la siguiente forma:

rsync -avzh --exclude=System\ Volume\ Information /media/belinux/TRANSCEND /media/belinux/ADATA\ HV610/copiaPrueba/


Y el resultado es el de la imagen siguiente:


Una cosa mas, habréis visto que escribo la barra inclinada al revés (\) y después un espacio en el directorio a excluir "System\ Volume\ Information", esto es precisamente para que el intérprete de comandos me detecte los espacios que lleva el nombre de este subdirectorio.

En definitiva la sintaxis a escribir del comando rsync que he utilizado es el siguiente:

comando  [opciones] [directorio origen] [directorio destino]

 
¿Y si queremos hacer una copia de archivos entre dos computadoras conectadas en una red WLAN mediante un router con este fantástico comando? ¿Como lo hacemos?

Primeramente debemos tener instalado en el ordenador destino de las copias, el paquete "openssh-server" y sus paquetes dependientes, porque el paquete "openssh-client" ya viene instalado de serie en Ubuntu. Pero ¿que son estos paquetes SSH?

SSH (Secure SHell, en español: intérprete de órdenes seguro) es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a servidores privados a través de una puerta trasera (también llamada backdoor). Permite manejar por completo el servidor mediante el intérprete de comandos.

SSH trabaja de forma similar a como se hace con telnet. La diferencia principal es que SSH usa técnicas de cifrado que hacen que la información que viaja por el medio de comunicación vaya de manera no legible, evitando que terceras personas puedan descubrir el usuario y contraseña de la conexión ni lo que se escribe durante toda la sesión.

En resumidas cuentas, vamos a crear un tunel de conexión cifrado entre dos ordenadores de nuestra red privada WLAN, por donde se van a transferir nuestros archivos de copia mediante el comando rsync de forma segura.

Por tanto vamos a comprobar que nuestro ordenador destino tenga ya instalado el paquete "openssh-server" y sus paquetes dependientes, de lo contrario lo instalamos con la siguiente instrucción en la terminal de comandos:

$ sudo apt-get install openssh-server

Ahora que ya lo tenemos instalado vamos a hacer una pequeña comprobación de que podemos conectarnos remotamente a nuestro ordenador destino mediante el protocolo SSH, para ello debemos saber que ip tiene asignada nuestro ordenador destino, lo comprobamos con el comando "ifconfig" en susodicho ordenador. También deberemos conocer el usuario y su contraseña para crear el túnel desde el usuario del ordenador origen hacia el usuario del ordenador destino.
Una vez sabidos estos tres requisitos vamos a escribir en el terminal de nuestro ordenador origen la siguiente instrucción que en mi caso será:

$ ssh benito@192.168.1.37

La sintaxis a escribir es el comando ssh seguido del usuario del ordenador remoto o destino, el simbolo @ como separador y la IP del ordenador remoto o destino asignada por el router.

Una vez ejecutado el comando os preguntará por la contraseña del usuario remoto y ya tenéis creado un tunel cifrado, ya tenéis acceso remoto al otro ordenador vía terminal de comandos. Apreciaréis que tenéis escrito en el prompt del usuario y la máquina del equipo remoto.

El resultado de la conexión es el siguiente:

Para salir y cerrar la conexión simplemente escribid el comando "exit", y veréis como el prompt vuelve a ser el de vuestro usuario en vuestro ordenador.


Una vez comprobado que nuestro comando ssh está instalado y funciona correctamente, vamos a utilizar nuestro comando rsync para realizar la copia de los directorios y archivos de forma recursiva que queramos.
Escribiremos en el terminal la siguiente instrucción:

$ rsync -avzh /home/belinux/copiaArchivos.sh benito@192.168.1.37:/home/benito

La sintaxis que he utilizado es el comando "rsync" con las opciones "-avzh", seguidamente el directorio o archivos que quiero copiar, en este caso solo copiaré un archivo que se encuentra en un directorio "/home/belinux/copiaArchivos.sh" y ahora escribiremos el usuario del ordenador destino "benito" con el @ como separador y la IP del ordenador destino "192.168.1.37", luego los dos puntos ":", como separador y seguido del directorio destino donde queremos copiarlo "/home/benito".

El resultado es el siguiente:

La sintaxis general del comando es:

rsync [opciones] [directorio o archivo origen] [usuario@host]:[directorio destino]

En el caso inverso, que nosotros queremos traernos o copiarnos del ordenador remoto una serie de archivos al nuestro, la mecánica es la misma pero la sintaxis general es:

rsync [opciones] [usuario@host]:[directorio o archivos origen] [directorio destino]

Espero os haya ayudado y nos vemos en el próximo post.
Saludos.

No hay comentarios:

Publicar un comentario

Gracias por participar en este blog.