Tecnolack - blog de cultura geek

Bash Script: scp archivos a un servidor remoto

account_circle Por Sagara access_time 08 de julio del 2013

Después de almacenar grandes cantidades de archivos o logs en un servidor, como en el ejemplo de los reportes con DB2 y Bash Script. Podemos enfrentarnos al problema del espacio en el disco duro. Lo mas común para resolver esto es mover a un servidor de respaldo los archivos, hacer cintas de respaldo o incluso eliminar archivos con una fecha mayor a n cantidad de tiempo para liberar espacio. Para el primer caso, veamos como hacer un Bash Script que haga un respaldo de los archivos que cuenten con cierta nomenclatura a un servidor remoto con scp.

Para realizar el siguiente ejemplo vamos a necesitar:

El comando básico para hacer la copia usando scp es así:

scp archivo username@remoteserver.com:/path/in/remote/server 

Vamos a tomar el ejemplo que hicimos anteriormente de los reportes de DB2 y Bash Script para crear un Script que haga el scp de los archivos al servidor remoto. El código podría empezar de la siguiente forma:

#!/bin/bash
_user="sagara"
_host="backup.tecnolack.com"
_dir="/home/sagara/"



# loop to all files in the current directory
for filename in *; do 
		 case "${filename}*" in 
		 		 *.sh):		 	 echo ".sh files will not be SCP" ;;
		 		 reportCandidates2fail*) scp "$filename" ${_user}@${_host}:${_dir} ; rm $filename ;;
		 		 *) 		 	 echo "We are not SCPing this $filename" ;;
		 esac
done
 

Log

Recordemos que la nomenclatura que utilizamos para los reportes era así: «reportCandidates2fail_MM_DD_YYYY.txt» (e.g. reportCandidates2fail_06_20_2013.txt). Si tenemos mas de un tipo de nomenclatura de archivos, simplemente agregamos una linea por cada uno con los mismos comandos: report2*) report3*)

Eso sería suficiente para hacer el trabajo, hacer un scp del archivo al servidor remoto y luego borrarlo del servidor local. Aunque podríamos agregar un log al script con algunos eventos para estar seguros que todo funciono bien.

_time=$(date)
_now=$(date +"%m_%d_%Y")
_file="backup_${_now}.log"

scpFile(){
		 scp "$filename" ${_user}@${_host}:${_dir}
		 if [ ${PIPESTATUS[0]} -ne 0 ]; then
		 		 echo "${_time} : Error while scp $filename" >> ${_file}
		 else
		 		 echo "${_time} : Successful scp $filename" >> ${_file}
		 		 #delete file
		 		 rm $filename
		 fi
}

Con la función anterior haremos el scp y revisaremos por medio del $PIPESTATUS, una variable interna del Bash, la cual nos dirá si el primer comando de la instrucción anterior ($PIPESTATUS[0]) fue ejecutado con éxito o no, en este caso el scp. Si el valor no es igual (-ne) a cero entonces es un error y no eliminamos el archivo, imprimimos cual archivo no se pudo copiar al log, un archivo con la nomenclatura backup_MM_DD_YYYY.log.

Y si fue copiado con éxito procedemos a eliminar el archivo original del servidor local.

 

Versión final

Para terminar agregamos la documentación del script, ademas podemos mandar la notificación por email con el contenido del log o incluso eliminar el archivo según nuestras necesidades.

#!/bin/bash
#
# ################################################
#
# Simple bash script to backup the reports to the
# backup-server
# Usage: sh runBackupReports.sh
# Version: 1.0 Date: 08-July-2013
#
# Contact: sagara@tecnolack.com
#
# ################################################
_user="sagara"
_host="backup.tecnolack.com"
_dir="/home/sagara/"

_time=$(date)
_now=$(date +"%m_%d_%Y")
_file="backup_${_now}.log"
_mailAdmin="sagara@tecnolack.com"

scpFile(){
		 scp "$filename" ${_user}@${_host}:${_dir}
		 if [ ${PIPESTATUS[0]} -ne 0 ]; then
		 		 echo "${_time} : Error while scp $filename" >> ${_file}
		 else
		 		 echo "${_time} : Successful scp $filename" >> ${_file}
		 		 #delete file
		 		 rm $filename
		 fi
}

# loop to all files in the current directory
for filename in *; do 
		 case "${filename}*" in 
		 		 *.sh):		 	 echo ".sh files will not be SCP" ;;
		 		 reportCandidates2fail*) scpFile ;;
		 		 *) 		 	 echo "We are not SCPing this $filename" ;;
		 esac
done

# cat ${_file} | mail -s "SCP BACKUP EVENTS" $_mailAdmin # Enable to send a mail
# rm ${_file} # Enable to delete the log file

Le damos permisos de ejecución y lo ejecutamos:

chmod +x runBackupReports.sh
sh runBackupReports.sh

Listo. Espero les sea de utilidad.

@Mail
Recibe actualizaciones vía email.