jueves, 13 de octubre de 2011

Sincronizacion automatica de folder local con un Servidor FTP (Reverse Mirror)

Gracias a la posibilidad de crear scripts en Bash muchas tareas que requieren cierta recurrencia, pero que en cada iteración el proceso se repite de la misma forma, aunque muchas otras no, se hacen mucho más fácil de ejecutar. También crear un script nos da la posibildiad de ejecutar una tarea que requiere el uso de varios comandos y opciones difíciles de memorizar. Bash nos permite mediante scripts hacer dichas tareas de forma transparente para el usuario común, pero le da al Sys Admin grandes ventajas y ahorro de tiempo.

Un trabajito que he tenido últimamente ha sido editar unos archivos de audio y subirlos a un hosting para luego ser publicados en un sitio web en modalidad de podcasts. Luego de editarlos (en Audacity) tengo que loguearme en la página del hosting, buscar el explorador de archivos y subir uno a uno los archivos de audio (que a veces son dos o tres) pero que van de 35 a 50 MB's.

Bueno, en fin, esto es aplicable a cualquier situación similar sin importar la cantidad o el tamaño de los archivos.


La finalidad de esto es ilustrar mediante un script la automatización de este proceso. Ya existen varias aplicaciones gráficas que hacen esta tarea como son FileZilla (multiplataforma) o SmartFTP (para Windows).

Manos a la obra...

Lo primero que haremos es comprobar que el proceso funciona de forma manual, es decir comando a comando en el terminal. El comando lftp (Sophisticated file transfer program) lo usaremos como el cliente FTP desde el cual nos conectaremos al servidor y haremos el trabajo.

Asumiremos que el folder local está ubicado en $HOME/audio, es decir /home/fraterneo/audio o ~/audio. Más adelante veremos por qué considero estas formas de referirme al folder local. Por otro lado el servidor FTP está en la dirección 192.168.24.101, en donde se tiene un usuario de nombre igual: fraterneo.

Conectándonos con el servidor con lftp:

fraterneo@rainbow:~$ lftp fraterneo@192.168.24.101
Password:
lftp fraterneo@192.168.24.101:/>

Para verificar que la conexión fue correcta entramos algún comando:

lftp fraterneo@192.168.24.101:/> ls
drwxrwxrwx   2 1582064  15000        4096 Apr 10  2011 audio

De no estar correctamente conectados, aparecerá un error como el siguiente:

lftp fraterneo@192.168.24.101:/> ls
ls: Login failed: 530 Login incorrect.
lftp fraterneo@192.168.24.101:/>

En el entendido de que todo salió bien, continuamos. Dentro del servidor FTP nos entramos al folder que va a ser sincronizado con nuestro folder local:

lftp fraterneo@192.168.24.101:/> cd audio/
lftp fraterneo@192.168.24.101:/audio>

Ahora desde el mismo servidor FTP con el comando lcd entramos al directorio local. Y finalmente iniciamos la sincronización con el comando mirror -Rn.

lftp fraterneo@192.168.24.101:/audio> lcd /home/fraterneo/audio

lcd ok, local cwd=/home/fraterneo/audio

lftp fraterneo@192.168.24.101:/audio> mirror -Rn
`audio01-octurbe.mp3' at 1488399 (33%) 89.7K/s eta:45s [Sending data]

Luego de finalizada la transferencia de todos los archivos se nos informa lo siguiente:

lftp fraterneo@192.168.24.101:/audio>
Total: 2 directories, 2 files, 0 symlinks
New: 2 files, 0 symlinks
7484394 bytes transferred in 86 seconds (85.0K/s)

Listo! El proceso funciona perfectamente de forma manual. 


Nota: Para este ejemplo de sincronización no he utilizado la opción -e en el comando mirror, la cual nos permite borrar los archivos no existentes en el origen, debido a la opción -R que hace que sea un reverse mirror, y -n solo copia los archivos no existentes en el destino.


Finalmente ya podemos crear el script de bash. Tendremos entonces dos ficheros, uno será el script en sí mismo y el otro contendrá los comandos de lftp para ser ejecutados secuencialmente. Esto hace el script más portable para otros usuarios.


Fichero ftpmirrorsync.lftp


fraterneo@rainbow:~$ nano ftpmirrorsync.lftp

open -ufraterneo,AdminFtP9138 192.168.24.101
cd audio
lcd ~/audio
mirror -Rn

Como podemos observar he utilizado la tilde de expansión (~) para referirme al directorio home del usuario actual (/home/fraterneo).

Fichero ftpmirrorsync.sh


fraterneo@rainbow:~$ nano ftpmirrorsync.sh


#!/bin/bash


LFTPSCRIPT="~/ftpmirrorsync.lftp"


lftp -f $LFTPSCRIPT


Ahora vemos la utilidad de la tilde de expansión en la definición de la variable LFTPSCRIPT. Con la opción -f de lftp le indicamos que use el fichero cuyo camino se guarda en la variable. 


Le otorgamos permisos de ejecución al script:


fraterneo@rainbow:~$ sudo chmod u+x ftpmirrorsync.sh

Ahora podemos agregar un job en /etc/crontab para ejecutar dicho script según nos convenga. También podemos copiarlo al folder /etc/cron.daily, /etc/cron.weekly, etc, etc, según querramos. Otra opción idónea sería instalar gnome-schedule, que maneja los jobs tipo crontab.


Artículos relacionados



Widget by Hoctro | Jack Book

1 comentario:

  1. Amigo me da un error, la sintaxis del .lftp es asi:

    open -usuario,password servidorftp

    ResponderEliminar