Mediante este script, se pueden realizar copias de resguardo remotas, utilizando una conexión encriptada con SSH.
#!/bin/sh
# 43 6 * * * /usr/local/sbin/remote_backup.sh 2>&1 | /bin/mail mail@dominio.com -s "Reporte del backup de host.dominio.com para el `/bin/date`"
# Remote backup script
#
# Author: Federico Voges <ftc@ftc.com.ar>
# Copyright 2004 Federico Voges. Modified by Felix Molinuevo :)
# Importante: Este script usa SSH para transferir los archivos de manera
# segura. Debido a esto, es necesario poder acceder via SSH *SIN PASSWORD*
# O sea: a leer el manual de SSH y asegurarse de entender como configurar
# public/private keys y sus implicaciones de seguridad :)
# Warning: This script uses SSH to transfer files in a secure way. This means
# that you should setup SSH to use public/private keys *WITHOUT PASSPHRASE*.
# That means: Read the man pages and make sure you understand how to configure
# public/private keys and the security considerantions :)
# Idioma/Language (es/en)
LANG=es
# Candidad de backups historicos (diarios y mensuales respectivamente)
# Number of historic backups to save
DAILY_BACKUPS=7
MONTHLY_BACKUPS=1
# Directorio donde se guardaran los backups
# Where to make the backups (you'll probably need a lot of space)
BACKUP_DIR="/mnt/backupdir"
# Host a backupear
# Remote hostname (host to backup)
SOURCE_HOST="host.dominio.com"
# Directorios a backupear. Importante:
# NO PONER BARRA "/" AL FINAL DEL NOMBRE
# NO PONER NOMBRES DE DIRECTORIOS QUE CONTENGAN ESPACIOS
# Remote directories to backup
# DO NOT PUT "/" AT THE END
# DO NOT USE DIRECTORY NAMES CONTAINING SPACES
SOURCE_DIRS="/home /etc /var /root"
#############################################################################
#
# No deberia ser necesario cambiar nada de aca en adelante...
# You shouldn't need to change anything below this
#
DAILY_DIR="${BACKUP_DIR}/daily"
MONTHLY_DIR="${BACKUP_DIR}/monthly"
DEST_DIR="${BACKUP_DIR}/rsync"
EXCLUDE="/tmp/`basename $0`.$$"
VERBOSE="0"
#FIND="/usr/local/bin/find.bigfiles" # Support for filesize >2GB
FIND="/usr/bin/find"
TAR="/bin/tar"
#RSYNC="/usr/sbin/rsyncd"
RSYNC="/usr/bin/rsync"
RSHELL="/usr/bin/ssh"
RSYNC_OPTS=""
RSYNC_OPTS="${RSYNC_OPTS} -e ${RSHELL}"
RSYNC_OPTS="${RSYNC_OPTS} --archive" # Equivalent to -rlptgoD:
# --recursive
# --links
# --perms
# --times
# --group
# --owner
# --devices
RSYNC_OPTS="${RSYNC_OPTS} --partial"
RSYNC_OPTS="${RSYNC_OPTS} --delete"
#RSYNC_OPTS="${RSYNC_OPTS} --relative" # Usar para directorios de 2do nivel (ej /usr/local)
RSYNC_OPTS="${RSYNC_OPTS} --delete-after"
RSYNC_OPTS="${RSYNC_OPTS} --compress"
#RSYNC_OPTS="${RSYNC_OPTS} --bwlimit=7"
RSYNC_OPTS="${RSYNC_OPTS} --exclude-from=${EXCLUDE}"
if [ "$VERBOSE" = "1" ]; then
RSYNC_OPTS="${RSYNC_OPTS} --progress"
RSYNC_OPTS="${RSYNC_OPTS} --verbose"
RSYNC_OPTS="${RSYNC_OPTS} --stats"
else
RSYNC_OPTS="${RSYNC_OPTS} --quiet"
fi
DATE="`date +%Y-%m-%d`"
BACKUP_FILE="${DAILY_DIR}/backup-${DATE}.tar.gz"
cat > ${EXCLUDE} << EOF
\.journal
lost\+found
aquota\.user
aquota\.group
quota\.user
quota\.group
/home/ftp/pub/*
/home/backup/*
/home/backup/tmp/*
/home/backup/mysql/*
/home/backup/old/*
/home/games/*
/home/games/.*
/var/tmp/*
/var/tmp/.*
*/.ccache
*/tmp/ccache
EOF
mkdir -p ${MONTHLY_DIR} || exit 1
mkdir -p ${DEST_DIR} || exit 1
mkdir -p ${DAILY_DIR} || exit 1
cd ${BACKUP_DIR}
if [ "$LANG" != "en" ]; then
echo "Iniciando proceso de backup"
echo "Sincronizando archivos"
else
echo "Starting backup process"
echo "Rsync'ing files"
fi
for d in ${SOURCE_DIRS}; do
TRY=0
while [ $TRY -le 10 ]; do
if [ "$VERBOSE" = "1" ]; then
${RSYNC} ${RSYNC_OPTS} ${SOURCE_HOST}:$d ${DEST_DIR}
else
${RSYNC} ${RSYNC_OPTS} ${SOURCE_HOST}:$d ${DEST_DIR} >& /dev/null
fi
rc=$?
if [ $rc = 0 ]; then
TRY=11
elif [ $rc = 20 ]; then
echo -e "\nProceso abortado (SIGINT)!"
exit 1
else
TRY=$[ $TRY + 1 ]
echo -e "\nError sincronizando archivos. Intentando nuevamente ($TRY/10)"
fi
done
if [ $TRY = 10 ];then
echo -e "\nError durante sincronizacion de archivos. Backup abortado!"
exit 1
fi
done
rm ${EXCLUDE}
if [ "$LANG" != "en" ]; then
echo "Haciendo backup para el dia ${DATE}"
else
echo "Making backup for ${DATE}"
fi
/bin/nice -n 19 ${TAR} -cpzf ${BACKUP_FILE} -C ${DEST_DIR} . || echo "Error!"
if [ "$LANG" != "en" ]; then
echo "Borrando los backups con mas de ${DAILY_BACKUPS} dias de antigüedad"
else
echo "Deleting backups older than ${DAILY_BACKUPS} days"
fi
${FIND} ${DAILY_DIR} -type f -daystart -name "backup-*" -mtime +$[${DAILY_BACKUPS} - 1] -exec rm -Rf {} \; 2> /dev/null
if [ "`date +%-d`" = "1" ]; then
if [ "$LANG" != "en" ]; then
echo "Haciendo copia para el backup mensual"
else
echo "Copying monthly backup"
fi
ln ${BACKUP_FILE} ${MONTHLY_DIR}
if [ "$LANG" != "en" ]; then
echo "Borrando los backups con mas de ${MONTHLY_BACKUPS} meses de antigüedad"
else
echo "Deleting backups older than ${MONTHLY_BACKUPS} month"
fi
${FIND} ${MONTHLY_DIR} -type f -daystart -name "backup-*" -mtime +$[$MONTHLY_BACKUPS * 31] -exec rm -Rf {} \; 2> /dev/null
fi
if [ "$LANG" != "en" ]; then
echo "Uso actual de disco:"
else
echo "Current disk usage:"
fi
du -shc *
if [ "$LANG" != "en" ]; then
echo "Proceso de backup finalizado."
else
echo "Backup process done."
fi