Precisamente porque los backups contienen información sensible parece inteligente encriptar tus copias de seguridad de SQL … o cualquier backup de tu sitio ¿no crees?
Lo que vamos a ver hoy es un script de consola útil para hacer backups seguros de los archivos y la base de datos de tu blog WordPress de una manera sencilla y que no te complique. Solo tienes que generar una llave GPG una vez, introducirla en 3 configuraciones y desde ese momento ya se puede ejecutar por cualquier usuario, y desde donde quieras.
¿Que hace?
Una vez lo ejecutas, este script te pide la localización de la carpeta raiz de tu blog y también donde está tu archivo wp-config.php. También te pedirá un UID (ID de usuario) de encriptación. A continuación el script guarda esas configuraciones en un fichero llamado .sbackup para que la siguiente vez que ejecutes el script se ejecute sin tener que volver a introducir esa información, muy útil para los cronjobs o para backups a voluntad rápidos y sencillos. Otra característica interesante de este script es que automáticamente analiza tu fichero wp-config.php para extraer el nombre de la base de datos MySQL, el usuario, servidor y contraseña. Con esto no comprometes tu seguridad al tiempo que no pierdes tiempo tecleando esos datos manualmente.
¿De que se hace backup?
Este script crea un fichero tar y gzip de toda tu directorio raiz en la carpeta ~/backups/domain.com/domain.com-fecha.tgz y también crea una copia de seguridad de tu base de datos de WordPress en un formato ideal para restaurarlo a posteriori. Ambos archivos se encriptan utilizando tu llave GPG, y pueden descargarse con seguridad ya que son necesarias la contraseña y la llave para desencriptarlos.
Generando la Llave GPG
Si no tienes aún una llave configurada para tu cuenta shell ejecuta este comando recordando (o apuntando) el UID que introduces en el script.
gpg --gen-key
Desencriptando los Archivos
gpg -r UID --output FILENAME.tgz --decrypt FILENAME.tgz.asc
El Script
#!/bin/bash # SiteBack Version 3.1, 2008-07-04 # GNU Free Documentation License 1.2 # 07-04-08 - AskApache (www.askapache.com) # Traducido por Ayuda WordPress (ayudawordpress.com) umask 022 ### OPCIONES DE CONSOLA set +o noclobber # allowed to clobber files set +o noglob # globbing on set +o xtrace # change to - to enable tracing set +o verbose # change to - to enable verbose debugging set -e # abort on first error shopt -s extglob ###########################################################################--=--=--=--=--=--=--=--=--=--=--# ### ### CONFIGURACIONES ### ###########################################################################==-==-==-==-==-==-==-==-==-==-==# DT=$(date +%x); DT=${DT//\/} DTX=$(date +%x-%H%M); DTX=${DTX//\/} BDIR=${HOME}/backups RUN_FILE=${BDIR}/$$.bk.log MY_CONFIG=".sbackup" DOMAIN=;DB_NAME=;DB_USER=;DB_PASSWORD=;DB_HOST=;WP_CONFIG=;SQL_DEST=;ARC_DEST=;ENCRYPT_USER= E_SUCCESS=0;E_YN=0;E_YES=251;E_NO=250;E_RETURN=65;C0=;C1=;C2=;C3=;C4=;C5=;C6=;C7=;C8=;C9= ###########################################################################--=--=--=--=--=--=--=--=--=--=--# ### ### FUNCIONES ### ###########################################################################==-==-==-==-==-==-==-==-==-==-==# #--=--=--=--=--=--=--=--=--=--=--# # script_title #==-==-==-==-==-==-==-==-==-==-==# function script_title(){ # ESTABLECE TITULO Y COLORES DE LA VENTANA case ${TERM:-dummy} in xterm*|vt*|ansi|rxvt|gnome*) C0="\033[0m";C1="\033[1;30m";C2="\033[1;32m";C3="\033[0;32m";C4="\033[1;37m" C5="\033[0;36m";C6="\033[1;35m";C7="\033[0;37m";C8="\033[30;42m";C9="\033[1;36m" esac echo -e "${C1} __________________________________________________________________________ " echo -e "| ${C2} ___ __ ___ __ ${C1} |" echo -e "| ${C2} / _ | ___ / /__ / _ | ___ ___ _____/ / ___ ${C1} |" echo -e "| ${C2} / __ |(_->> ${C4}${1} ${C0} \n\n"; ;; "info") echo -e "${C6}=> ${C4}${1} ${C0}"; ;; "item") echo -e "${C4}-- ${C0}${1} "; ;; esac } #--=--=--=--=--=--=--=--=--=--=--# # yes_no #==-==-==-==-==-==-==-==-==-==-==# function yes_no(){ local ans echo -en "${1} [y/n] " ; read -n 1 ans case "$ans" in n|N) E_YN=$E_NO ;; y|Y) E_YN=$E_YES ;; esac } #--=--=--=--=--=--=--=--=--=--=--# # do_sleep #==-==-==-==-==-==-==-==-==-==-==# function do_sleep (){ local END DIFF echo -en "${C5}${3:-.}"; while [ -r "$RUN_FILE" ]; do sleep ${2:-3}; echo -en "${3:-.}"; done; echo -e "${C0}"; sleep 1; END=$(date +%s);DIFF=$(( $END - $START )) echo -e "\n${C8} [T: ${SECONDS}] COMPLETED IN ${DIFF} SEC ${C0} \n\n"; sleep 1; return 0; } #--=--=--=--=--=--=--=--=--=--=--# # get_settings #==-==-==-==-==-==-==-==-==-==-==# function get_settings(){ local cha HOSTED_SITES G clear; script_title if [[ -r "$MY_CONFIG" ]]; then OIFS=$IFS; while IFS=: read DOMAIN DOMAINROOT WP_CONFIG ENCRYPT_USER; do DOMAIN=${DOMAIN}; DOMAINROOT=${DOMAINROOT}; WP_CONFIG=${WP_CONFIG}; ENCRYPT_USER=${ENCRYPT_USER}; E_YN=$E_YES; break done < ${MY_CONFIG}; IFS=$OIFS else echo -en "\n De que dominio quieres hacer backup? "; read -e DOMAIN; echo until [ -d "$DOMAINROOT" ]; do echo -en "\n Donde esta el directorio raiz? "; read -e DOMAINROOT; echo; done [[ -r "$DOMAINROOT/wp-config.php" ]] && WP_CONFIG=$DOMAINROOT/wp-config.php until [[ -r "$WP_CONFIG" ]]; do echo -en "\n Donde esta el archivo wp-config.php? "; read -e WP_CONFIG; echo; done echo -en "\n Cual es el ID de usuario para encriptar? "; read -e ENCRYPT_USER; echo fi [[ -r "$WP_CONFIG" ]] && G=$(sed -e "/define('DB_\(NAME\|USER\|PASSWORD\|HOST\)/!d" \ -e "s/[^']*'DB_\(NAME\|USER\|PASSWORD\|HOST\)'[^']*'\([^']*\)'.*$/DB_\1='\2';/g" ${WP_CONFIG}) && eval $G; mkdir -p ${BDIR}/${DOMAIN} SQL_DEST=${BDIR}/${DOMAIN}/${DOMAIN}-${DT}.sql; [[ -r "${SQL_DEST}.asc" ]] && SQL_DEST=${BDIR}/${DOMAIN}/${DOMAIN}-${DTX}.sql ARC_DEST=${BDIR}/${DOMAIN}/${DOMAIN}-${DT}.tgz; [[ -r "${ARC_DEST}.asc" ]] && ARC_DEST=${BDIR}/${DOMAIN}/${DOMAIN}-${DTX}.tgz if [[ "$E_YN" != "$E_YES" ]]; then for a in "DOMAIN" "DOMAINROOT" "WP_CONFIG" "ENCRYPT_USER" "DB_NAME" "DB_USER" "DB_PASSWORD" "DB_HOST"; do echo -e "${a}: ${!a}"; done echo; yes_no "SON CORRECTAS ESTAS CONFIGURACIONES" fi while [[ "$E_YN" != "$E_YES" ]]; do for a in "DOMAIN" "DOMAINROOT" "WP_CONFIG" "ENCRYPT_USER" "DB_NAME" "DB_USER" "DB_PASSWORD" "DB_HOST"; do echo -en "\n (Enter for Default: ${!a} )\n ${a}:> " read -e cha; echo; [[ ${#cha} -gt 2 ]] && eval "$a"=$cha done yes_no "SON CORRECTAS ESTAS CONFIGURACIONES" done echo -e "${DOMAIN}:${DOMAINROOT}:${WP_CONFIG}:${ENCRYPT_USER}" > $MY_CONFIG } #--=--=--=--=--=--=--=--=--=--=--# # exit_cleanup #==-==-==-==-==-==-==-==-==-==-==# function exit_cleanup(){ cd $OLDPWD [[ -r ${SQL_DEST} ]] && rm ${SQL_DEST} [[ -r ${ARC_DEST} ]] && rm ${ARC_DEST} } ############################################################################################################ ### ### CODIGO PRINCIPAL ### ############################################################################################################ #=# COGE EL SCRIPT APAGADO POR EL USUARIO trap exit_cleanup SIGHUP SIGINT SIGTERM #=# HACE AGRADABLE EL SCRIPT PRINCIPAL renice 19 -p $$ &>/dev/null cd `dirname $0` get_settings pm "CREAANDO BACKUP DE SQL" mysqldump --opt -u${DB_USER} -p${DB_PASSWORD} -h ${DB_HOST} -r ${SQL_DEST} \ --add-drop-table ${DB_NAME} 1>&2 &>/dev/null && sleep 2 1>&2 &>/dev/null && rm ${RUN_FILE} 2>&1& do_sleep 1 1 ":" pm "ENCRIPTANDO BACKUP DE SQL" gpg --armor --recipient ${ENCRYPT_USER} --output ${SQL_DEST}.asc --encrypt ${SQL_DEST} \ 1>&2 &>/dev/null && sleep 2 1>&2 &>/dev/null && rm ${RUN_FILE} 2>&1& do_sleep 1 1 ":"; rm ${SQL_DEST} pm "CREATING ARCHIVE BACKUP" tar -czf ${ARC_DEST} . 1>&2 &>/dev/null && rm ${RUN_FILE} 2>&1& do_sleep 1 5 ":" pm "ENCRIPTANDO BACKUP DEL ARCHIVO" gpg --armor --recipient ${ENCRYPT_USER} --output ${ARC_DEST}.asc --encrypt ${ARC_DEST} \ 1>&2 &>/dev/null && rm ${RUN_FILE} 2>&1& do_sleep 1 1 ":"; rm ${ARC_DEST} echo -e "${C1} __________________________________________________________________________ " echo -e "| |" echo -e "| ${C4} COMPLETADO CON EXITO ${C1} |" echo -e "${C1} __________________________________________________________________________ ${C0} \n\n" cd $OLDPWD exit $?
Esta maravilla de script lo han creado en AskApache y también lo puedes descargar directamente en este enlace.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!