Herramientas personales

Backup entre 2 servidores automático por FTP

De Proyectos GULIX

Aquí puedes revisar 2 Scripts diseñados para hacer un backup completo de una cuenta FTP específica. Especialmente diseñado para realizar backups a tus cuentas en servicios de hosting.

Cada ejemplo cuenta con varios archivos, necesitarás crearlos con los scripts, que se indican.


Tabla de contenidos

Ejemplo 1

Para el ejemplo 1 utilizaremos el comando lftp más un pequeño script que realizará el proceso y sendmail para enviar un mail al momento de terminar la tarea. Una tarea programada con crontab automatizará el proceso.

Introducción que es lftp

El comando LFTP sirve para realizar un FTP más avanzado. Lo usaremos para hacer un mirror de todo un sitio web que lo llamaremos SERVER2, mientras que SERVER1 será el servidor que realice el proceso de conectarse al SERVER2 y copiar sus ficheros por lo tanto:

SERVER1 : Alamacena el respaldo SERVER2 : Tiene los ficheros que se respaldarán

El comando lftp en realidad es un programa que suele venir instalado en todos los Linux, así que lo más seguro es que lo tengamos instalado en nuestro servidor.

Sin hablar más veamos la estructura de directorios que debemos tener en SERVER1:

root@fenix:/home/knx/CarpetaScript# tree
.
|-- confautoconeccion
|   `-- ftpauto.txt
|-- enviaMail
|-- log.log
`-- respaldoBKN.sh

1 directory, 4 files

Creando los ficheros del script

Fichero confautoconeccion/ftpauto.txt

open SERVER2.cl -u usuarioFTPSERVER2,claveusuarioFTPSERVER2
mirror -v RUTA/CARPETaREMOTA/ /home/knx/RESPALDOS/SERVIDOR2.CL/
bye

Fichero respaldoBKN.sh

#!/bin/bash

archivoLog=/home/knx/SERVIDOR2/log.log
directorioRemotoARespaldar=./
directorioLocalGuardaRespaldo=/home/knx/RESPALDOS/SERVIDOR2.CL/
directorioLocalDescarga=/home/knx/public_html
nombreDelArchivoARespaldar="RespaldoCompletoSERVIDOR2.tar.gz"
destinatarioCorreo= tucorreo@gulix.cl
mensajeCorreo="Se realizado una copia de respaldo del servidor"
servidorFTP=servidor2.cl
userFTP=usuarioFTPSERVER2
passFTP=claveusuarioFTPSERVER2
tituloDelCorreo="Realizado Respaldo del servidor"
nombreDelArchivoARespaldar=`date -d now +"$directorioLocalGuardaRespaldo%F$nombreDelArchivoARespaldar"`

echo "open $servidorFTP -u $userFTP,$passFTP">> $directorioLocalGuardaRespaldo"temporal.knx"
echo "mirror -v $directorioRemotoARespaldar $directorioLocalGuardaRespaldo">> \
$directorioLocalGuardaRespaldo"temporal.knx"
echo "bye">> $directorioLocalGuardaRespaldo"temporal.knx"

echo "Log de Respaldaldo del Sistema $servidorFTP">> $archivoLog
echo "==============================">> $archivoLog
echo  "comienza respaldo a las con fecha $(date) ,mientras knx DUerme Zzzz..">> $archivoLog

lftp -f $directorioLocalGuardaRespaldo"temporal.knx" >> $archivoLog
rm -f $directorioLocalGuardaRespaldo"temporal.knx"

echo "Log de Creacion de Fichero">> $archivoLog
echo "===========================">> $archivoLog

tar czvf $nombreDelArchivoARespaldar MirrorSERVER.CL|cp $nombreDelArchivoARespaldar $directorioLocalDescarga
cp log.log /home/knx/public_html
echo "**Si todo quedo bien el archivo se alla en $nombreDelArchivoARespaldar">> $archivoLog
echo "Guardando log en $archivoLog [OK]">> $archivoLog
echo  "TERMINA respaldo a las con fecha $(date) ,mientras knx sigue Durmiendo Zzzz..">> $archivoLog
echo "============Respaldo Finalizado===============">> $archivoLog
echo "Todo quedo bien"|mail -s "RealizadoRespaldodelservidor" $destinatarioCorreo

Fichero enviaMail

if [ "$#" -eq 2 ]
	then  
	our_name=$1
	our_addr=$2
	mail_to_name=$3
	mail_to_addr=$4
	mail_subject=$5
	mail_body="Attached file"
 	attachment="$6"
 	separator='----=_parts_separator_'
  	if [ -r "$attachment" ] 
	then

 		attached_mime="$( file -ib "$attachment" )"
		attached_name="$( basename "$attachment" )"

 		{
		# Imprimimos las cabeceras basicas del correo
		echo "From: $our_name <$our_addr>"
		echo "To: $mail_to_name <$mail_to_addr>"
		echo "Subject: $mail_subject"
		echo "MIME-Version: 1.0"
		echo "Content-Type: MULTIPART/MIXED;"
		echo "        boundary=\"$separator\""
		echo
		echo "        This message is in MIME format."
		echo

		# Print the body
		echo "--$separator"
		echo "Content-Type: text/plain; charset=UTF-8"
		echo "Content-Transfer-Encoding: 7bit"
		echo "Content-Disposition: inline"
		echo
		echo "$mail_body"
		echo
		echo

		# attach the uuencoded file
		echo "--$separator"
		echo "Content-Type: $attachment_mime; name=$attached_name"
		echo "Content-Transfer-Encoding: base64"
		echo "Content-Disposition: attachment; filename=$attached_name"
		echo
		uuencode -m "$attachment" - | grep -v "^begin"
		echo

		# and print the footer
		echo "--$separator--"

		} | /usr/sbin/sendmail "$mail_to_addr"
	fi
fi

Programando la tarea en crontab

No necesita mucha explicación, lo agregamos al crontab, en este ejemplo se ejecutará todos los dias a las 2 de la mañana.

crontab -e
# [minuto(0- 60)  hora(0-23) mesdia(1-31) mes(1-12) diasemana (0-7)]
* 02 * * * /home/knx/respaldoBKN.sh

Ejemplo 2

Este ejemplo está enfocado en resolver la problemática de respaldar una cuenta FTP de un servidor remoto a la máquina local. Esto puede ser muy útil para respaldar cuentas FTP de servidores de hosting tradicionales.

Para el ejemplo 2 utilizaremos el cliente ftp ncftpget con un script donde estarán los parametros de conexión al servidore que queremos respaldar. Más un pequeño script en php utilizando las librerías phpmailer para enviar un correo mediante un servidor SMTP externo ( aquí también deberemos configurar la cuenta de correo desde donde se enviará el correo de notificación).

Finalmente una tarea programada automatizará el proceso.

Estructura de directorios y archivos

|-- includes
|   |-- class.phpmailer.php
|   |-- class.pop3.php
|   `-- class.smtp.php
|-- notificar.php
|-- script.sh

script.sh

script.sh es el archivo principal, contiene todas las intrucciones y configuraciones necesarias para conectarse al servidor FTP y realizar una copia de este.

  • ruta_respaldo : es la ruta donde se almacenarán los respaldos en tu máquina.
  • ruta_del_script: es la ruta donde se encuentra almacenado este script.
  • USUARIO: usuario del ftp.
  • CLAVE: clave del usuario del ftp.
  • HOST: dirección del servidor ftp.
#Este script esta disenado para respaldar todos los documentos de la 
# cuenta ftp de timberline chile en un disco local.
#by Danilo Lacoste dlacoste@timberline.cl
# 

#!/bin/bash

#variables

ruta_respaldo="/home/dalacost/FTP/respaldos/";
ruta_del_script="/home/dalacost/FTP/script/";
USUARIO="usuarioFTP";
CLAVE="claveFTP";
HOST="ftp.miservidor.cl";

FECHA=`date +%d_%m_%Y__%H.%M`;

#comandos

cd $ruta_del_script;

#carpeta donde se descargara todo
mkdir $ruta_respaldo/$FECHA;

#cliente ftp encargado de descargar los archivos y dejarlos en la carpeta
ncftpget -R -u $USUARIO -p $CLAVE $HOST $ruta_respaldo/$FECHA /

#comprimir todo
tar -cvzf $ruta_respaldo/$FECHA.tar.gz $ruta_respaldo/$FECHA

#borrar la carpeta cuando se termine de comprimir
rm -rf $ruta_respaldo/$FECHA

#notificando que el archivo ya esta listo
echo "<?\$path=\"$ruta_respaldo\";?>" > temp.php
php -r 'require "temp.php";require "notificar.php";'

notificar.php

Este archivo es encargado de realizar una notificación mediante las librerías phpMailer. Conectándose a un servidor SMTP con una autenticación tradicional.

se deben editar los siguientes parámetros:

  • PluginDir : es la dirección relativa donde se encuentra las librerías phpMailer.
  • Mailer: el tipo de conexión que usarás para enviar el correo, en el caso de este script usaremos SMTP.
  • Host: tu servidor de correos.
  • SMTPAuth: si tu servidor de correos requiere autenticación esto debería ser true.
  • Username : en caso de requerir autenticación, aquí deberás especificar el nombre de usuario.
  • Password : y con este las password.
  • From: especificar el correo remitente.
  • FromName: especificar el nombre del correo remitente.
  • AddReplyTo: especificar a quien responder.
  • AddAddress: Dirección de destino ( a quien le llegará el correo ).
<?
function GetRealSize($file) {
        // Return size in Mb
        clearstatcache();
        $INT = 4294967295;//2147483647+2147483647+1;
        $size = filesize($file);
        $fp = fopen($file, 'r');
        fseek($fp, 0, SEEK_END);
        if (ftell($fp)==0) $size += $INT;
	echo $file."\n";
        fclose($file);
        if ($size<0) $size += $INT;
        return ceil($size/1024/1024);
    }


$dir = opendir($path);
$lista="";


while ($elemento = readdir($dir))
{

 if($elemento != ".." && $elemento !=".")
  {
		//echo $path;
		//echo $elemento."\n";
		//$tam=GetRealSize($path.$elemento);
		//sprintf("%u", filesize($path.$elemento));
		$lista.=$elemento."\n";//."  tam=$tam\n";
  }
}
closedir($dir);

echo $lista;

  require "includes/class.phpmailer.php";

  $mail = new phpmailer();
  $mail->PluginDir = "includes/";
  $mail->Mailer = "smtp";
  $mail->Host = "mail.miserverdecorreo.cl";
  $mail->SMTPAuth = true;
  $mail->Username = 'misusuariodecorreo'; 
  $mail->Password = 'miclavedecorreo'; 
  $mail->From = "softrobot@gulix.cl";
  $mail->FromName = "Robot de Notificaciones";
  $mail->AddReplyTo('softrobot@gulix.cl', 'SoftRobot');


  //el valor por defecto 10 de Timeout es un poco escaso dado que voy a usar 
  //una cuenta gratuita, por tanto lo pongo a 30  
  $mail->Timeout=120;


//direcciones de destino
 $mail->AddAddress("destinatario@gulix.cl");

  //Asignamos asunto y cuerpo del mensaje
  //El cuerpo del mensaje lo ponemos en formato html, haciendo 
  //que se vea en negrita
  $mail->Subject = "Nuevo Archivo de Respaldo FTP Listo";
  $mail->Body = 
"Ya se encuentra disponible un nuevo archivo de respaldo.\n
 
Lista de archivos disponibles:
(dia_mes_ano__hora:minutos)
 ".$lista."

--
Soft Robot
Robot de automatizacion de respaldos
www.gulix.cl";


  //se envia el mensaje, si no ha habido problemas 
  //la variable $exito tendra el valor true
  $exito = $mail->Send();

  //Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas como mucho 
  //para intentar enviar el mensaje, cada intento se hara 5 segundos despues 
  //del anterior, para ello se usa la funcion sleep	
  $intentos=1; 
  while ((!$exito) && ($intentos < 5)) {
	sleep(5);
     	echo $mail->ErrorInfo;
     	$exito = $mail->Send();
     	$intentos=$intentos+1;	
	
   }
 
		
   if(!$exito)
   {
	echo "Problemas enviando correo electrónico a ".$valor;
	echo "
".$mail->ErrorInfo; } else { echo "Mensaje enviado correctamente"; } ?>

Librerías PHPMailer

la última versión de las librerías PhpMailer las puedes descargar del sitio oficial de sus fabricantes http://phpmailer.sourceforge.net , solo debes asegurarte que los archivos class.phpmailer.php, class.pop3.php y class.smtp.php queden dentro del directorio includes

Cargar la tarea programada

Para esto puede utilizar la herramienta gráfica gnome-schedule , para ejecutar el script debe especifar la ruta completa hacia este: /ruta/desde/la_raiz_a_mi/script.sh

Leer más

Autores de este Resumen

  • --Knxroot 05:44 22 feb 2010 (UTC) (ejemplo 1 )
  • --Dalacost 13:35 22 feb 2010 (UTC) (ejemplo 2 )

Buscar