Archivo de la etiqueta: gmail

Hacer copias de seguridad usando gmail II

En el anterior artículo vimos que podemos exprimir un poco más nuestra cuenta de correo en la nube (gmail en este caso) y aprovechar los muchos megas que nos ofrecen gratis para salvaguardar no sólo mails sino también archivos.

Ahora vamos un paso más allá para agilizar este proceso. Con lo visto hasta ahora, si queremos hacer un backup de un archivo usando gmail tenenos que abrir gmail en el navegador, darle a «Redactar», crear el mensaje, rellenarlo, incluir el adjunto y enviar… Esto es sencillo pero lo cierto es que nos quita tiempo, ese recurso tan importante y escaso. Podemos hacerlo más rápido con un script. Veamos cómo.

En un artículo anterior vimos cómo enviar mails desde nuestra cuenta de gmail usando la línea de comandos. Vamos a hacer uso de esto para agilizar la copia de seguridad de archivos. Os muestro un ejemplo de script que realizaría esta tarea:

#!/bin/bash

echo -n "Subject: "
read SUBJECT
SUBJECT="-backup- $SUBJECT"

echo -n "Body: "
read BODY

echo -n "Enviando mail..."
echo $SUBJECT > /tmp/subject
echo $BODY > /tmp/body
/usr/local/bin/send_gmail /tmp/subject /tmp/body $1
echo "OK"

Este script hace uso del script que vimos en dicho artículo (send_gmai), script que hemos dejado en /usr/local/bin para poder ejecutarlo desde la línea de comandos de forma habitual sin necesidad de incluir la ruta (aunque en el script de arriba sí que lo hacemos para asegurarnos de que funciona siempre independientemente del valor de la variable de entorno PATH).

Lo que hace es pedirnos el subject y meterle luego la cadena -backup- para que no tengamos de preocuparnos de meterla nosotros manualmente. Esta palabra es la que, como dijimos en el artículo anterior, usamos para hacer el filtro. Podríamos crearnos distintos scripts para distintos tipos de backups si quisiéramos y cambiar aquí -backup- por otra cosa en cada uno. Posibilidades hay mil.

También nos pide el cuerpo del mensaje. Si no lo necesitáis podéis obviar esto y meter siempre algo como «backup» y váis más rápidos.

Para finalizar, llama al script send_gmail, el cuál envía el correo electrónico con el adjunto que pasamos como único parámetro al script en cuestión, el cuál llamaremos, por ejemplo, backup_file. Así pues, suponiendo que queremos hacer un backup de un archivo llamado proyecto.odt que tenemos en el directorio actual, lo llamaríamos así:

backup_file proyecto.odt

Como digo, las posibilidades son muchas. Podéis automatizar el backup de un directorio entero, por ejemplo. Podéis añadir también automáticamente la fecha en el subject o el cuerpo del mensaje para tenerlo mejor clasificado (aunque esto ya se ve en la fecha y hora del propio mail). Podéis quitar los read y meter algo estático y luego meter el script en el crontab para que haga backup de cierto archivo o directorio cada hora, por ejemplo…

Alguien dirá que para esto ya está Dropbox, Google Drive, etc. Sí, pero a mí me gusta usar este método también porque estos archivos de backup son versiones de un fichero y, una vez finalizado, ya no las necesitaré aunque no viene de más tenerlas en una especie de cajón desastre que puedo consultar el día de mañana. Digamos que no quiero ver esos ficheros «temporales» en mis directorios de Dropbox ni GDrive, sino que prefiero almacenarlos en algún lugar que, aunque seguro, es menos accesible (*), porque además, el hecho de tener muchas versiones de un archivo en un directorio y no tener un control luego puede ser un caos.

(*) Lo cuál es cómodo desde un punto de vista organizativo.

Enviando un mail de gmail desde la línea de comandos

Enviar mails desde la línea de comandos de Linux es bastante sencillo. Hay un comando llamado «mail» que hace esto sin problemas. Si nos instalamos un servidor de correo SMTP como postfix, ya lo tendremos.

El problema es que estaremos enviando mails desde un servidor de correo cuyo dominio (el que hayamos puesto nosotros, algo como «micasa.com») o bien no existe o si lo hace no está a nuestro nombre. Si enviáis unos pocos e-mails al día puede que todo vaya bien pero, si enviáis más correos, esto puede ocasionar problemas (por ejemplo, vuestro proveedor de servicio a Internet os pegaría un toque por posible SPAM).

Lo mejor es hacer las cosas bien hechas para evitar problemas (*); en este caso, lo suyo es enviar correos legítimos, desde una cuenta «oficial», de un dominio «oficial» (registrado, vamos). Vamos, que si enviamos un correo desde loquesea@gmail.com, ese correo debería partir del servidor gmail.com, es decir, el servidor de correo de Google.

Para hacer esto desde línea de comandos os recomiendo el comando «mailx», que además nos permite enviar adjuntos.

Vamos a ver cómo usarlo para enviar un mail desde nuestra cuenta de gmail. Lo que vamos a ver es cómo usar mailx para enviar correos desde la línea de comandos usando nuestra cuenta de gmail (a través, por supuesto, de los servidores de Google).

Lo que tenemos que hacer es especificar los distintos parámetros (servidor, puerto, usuario, password…) con la opción -S. Nos quedaría algo así:

mailx -v -s "ASUNTO" -S smtp=smtp.gmail.com:587 -S smtp-auth-user=VUESTRO_USUARIO_DE_GOOGLE@gmail.com -S smtp-use-starttls -S smtp-auth-password=VUESTRO_PASSWORD -S from=VUESTRO_USUARIO_DE_GOOGLE@gmail.com MAIL_DESTINO

Al ejecutar esto os dejará escribir el cuerpo del mensaje. Para finalizar el mail, dar un par de veces a Intro, escribid un punto y darle de nuevo a Intro (es la forma de decirle a mailx que habéis terminado de redactar el mail).

Si queréis hacerlo menos interactivo podéis pasarle el cuerpo del mensaje así:

echo «CUERPO DEL MENSAJE…» | mailx -v -s «ASUNTO»…

Si queréis un cuerpo más completo, con intros y demás, podéis pasarle un archivo (tanto como cuerpo de mensaje como de asunto). También podéis registrar los logs de salida y error por si algo fallara poder estudiar cuál ha sido el problema. Un script que contemple ambas cosas podría quedar así:

DATE=`date +%Y-%m-%d--%H-%M`
if [ $# = '0' ]; then
     echo send_gmail FILE_SUBJECT FILE_BODY \[ FILE_ATTACH \]
elif [ $# > '1' ]; then
     SUBJECT=`cat $1`
     if [ $2 ]; then
        BODY=`cat $2`
     else
        BODY="."
     fi
     ATTACH=$3
     if [ $ATTACH ]; then
        echo $BODY | mailx -v -s $SUBJECT -a $ATTACH -S smtp=smtp.gmail.com:587 -S smtp-auth-user=VUESTRO_USUARIO_DE_GOOGLE@gmail.com -S smtp-use-starttls -S smtp-auth-password=VUESTRO_PASSWORD -S from=VUESTRO_USUARIO_DE_GOOGLE@gmail.com MAIL_DESTINO >/tmp/mail_$DATE.log 2>/tmp/mail_$DATE.err
     else
        echo $BODY | mailx -v -s $SUBJECT -S smtp=smtp.gmail.com:587 -S smtp-auth-user=VUESTRO_USUARIO_DE_GOOGLE@gmail.com -S smtp-use-starttls -S smtp-auth-password=VUESTRO_PASSWORD -S from=VUESTRO_USUARIO_DE_GOOGLE@gmail.com MAIL_DESTINO >/tmp/mail_$DATE.log 2>/tmp/mail_$DATE.err
     fi
fi

Lo he hecho rápidamente, así que se puede mejorar mucho a la hora de tratar los parámetros. De todas formas, así es perfectamente válido (doy fe ;-). A continuación explico cómo funciona.

Lo que hace el script es coger la fecha del sistema (en la variable DATE) para que nuestros archivos de log la tengan incorporada en el nombre de archivo (así es más fácil identificar de cuándo son).

Después, si el número de parámetros es 0 muestro un mensaje de uso correcto del script (cuyo nombre es «send_gmail» en este ejemplo), que básicamente es, el nombre del script, el fichero que lleva el subject del mensaje, el fichero que lleva el cuerpo del mensaje y, opcionalmente, el archivo que queremos adjuntar.

Si el número de parámetros es mayor que 1 (**) el asunto del mensaje (SUBJECT) es el contenido del primer argumento. Si existe un segundo parámetro sería el fichero que contendría el cuerpo del mensaje. Si no existe segundo parámetro se pone un «.» (podemos poner un espacio o una palabra por defecto) porque si no ponemos nada fallará el script.

Si hay un tercer argumento ejecutaremos el comando que hemos visto antes con la opción «-a $ATTACH», que incluirá dicho archivo como adjunto.

Esto os puede venir de perlas para cosas como enviar mails al iniciar el equipo para indicar que está operativo (como vimos en el artículo anterior «Ejecutar scripts al inicio de Linux»), para enviar mails de notificación desde nagios o, como veremos en un artículo posterior, para hacer backups de archivos rápida y cómodamente.

(*) Esto se debería aplicar a todos los aspectos de la vida. Si todo el mundo lo hiciera… irían mejor las cosas, nor?
(**) como mínimo hemos introducido subject y body; si introducimos 3, el tercero es el fichero a adjuntar; a partir del tercer parámetro se ignoran si los hubiera.