jueves, octubre 15, 2015

Sincronizando archivos por FTP usando OSX y LFTP

Hace poco necesité establecer un sistema de copias de seguridad mediante un MacBook Air hacia un servidor FTP. Para la sincronización de archivos no encontré ningún cliente gratuito que fuera del estilo de SyncBack para Windows (el más cómodo que he probado) y acabé encontrando que lo podía hacer mediante lftp, un cliente libre de ftp que puedes instalar en tu mac mediante homebrew.

Lo primero sería instalar el gestor de paquetes Homebrew (una herramienta al estilo de apt-get) en tu mac.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Instalas lftp con

brew install lftp

Lftp funciona como el comando ftp pero añade unas cuantas funciones especiales, lo que implica que si lo quieres hacer todo en un click-y-listo tendrás que crear un script. Este es el que uso yo:

#!/bin/bash

##esta es la parte que tienes que parametrizar
login="nombre_usuario"
pass="password"
host="servidor_ftp"
remote_dir="/carpeta_en_el_servidor/"
local_dir="$HOME/carpeta_en_tu_ordenador/"
## fin de los parámetros

base_name="$(basename "$0")"
lock_file="/tmp/$base_name.lock"
trap "rm -f $lock_file" SIGINT SIGTERM
if [ -e "$lock_file" ]
then
    echo "$base_name is running already."
    exit
else
    touch "$lock_file"
    lftp -u $login,$pass $host << EOF
    set ftp:ssl-allow no
    set mirror:use-pget-n 5
    mirror -R -e -c -P5 --log="/tmp/$base_name.log" "$local_dir" "$remote_dir"
    quit
EOF
    rm -f "$lock_file"
    trap - SIGINT SIGTERM
    exit

fi

Guarda el script en tu máquina con la extensión .command y hazlo ejecutable con:

chmod +x nombre_archivo.command

La extensión .command permite que luego puedas lanzar el script directamente desde el Finder.

La clave del script está en el comando

mirror -R -e -c -P5 --log="/tmp/$base_name.log" "$local_dir" "$remote_dir"

-R indica que la copia es "reversa", es decir, que se copian los contenidos de tu directorio local al remoto. Si quisieras invertir el proceso puedes hacerlo eliminando este parámetro.
-e es una opción importante. Elimina en el servidor remoto los archivos que no existan en el directorio local. Es la opción que garantiza realmente que el directorio de destino sea un espejo del original.
-c continúa el proceso de sincronización en caso de que se haya interrumpido
-P5 trocea los archivos en 5 para hacer 5 conexiones concurrentes. Puedes variar este valor dependiendo de tu conexión.
--log guarda un archivo de log para que puedas analizar si hay algún problema.

¡y ya está! Puedes mover el script a tu escritorio y probarlo lanzando un doble click. Te sugiero hacer primero unas pruebas con un directorio y contenidos de prueba antes de poner tu base de datos de producción en manos de este script :-D.



No hay comentarios:

Publicar un comentario