Chuletillas (y XXXXV) – Integrar comandos MySQL en un shell script

chuletaExisten diversas formas de integrar comandos de MySQL dentro de un shell script de linux. La más cómoda, creo, es utilizar el parámetro -e del cliente en línea de myql. Por ejemplo, así:

#!/bin/sh
# comandos bash...
mysql -u usuario -p -e "CREATE DATABASE ejemplo;"
#comandos bash...

Lo que pasa es que así puesto sirve de bien poco porque nos va a pedir el password de forma interactiva. Para evitarlo podemos poner la password en el propio archivo del script. No es un método elegante ni especialmente seguro, pero en entornos poco críticos sirve perfectamente:

#!/bin/sh
PASSWORD=mipassword
# comandos bash...
mysql -u usuario --password=$PASSWORD -e "CREATE DATABASE ejemplo;"
#comandos bash...

Por último, si tenemos que ejecutar varios comandos, lo más cómodo es escribirlos uno a continuación de otro en un archivo independiente (con extensión sql por claridad) y ejecutarlos usando el comando source de mysql:

#!/bin/sh
PASSWORD=mipassword
# comandos bash...
mysql -u usuario --password=$PASSWORD -e "source /opt/sripts/imysql/importar_databases.sql"
#comandos bash...
NOTA: Todo lo dicho aquí sirve igualmente para MariaDB

Nombres de fichero con marcas de tiempo o secuenciales

chuleta A veces necesitamos generar ficheros a intervalos regulares en un determinado directorio sin perder los creados anteriormente. Para hacerlo de forma automática y desde un script es necesario que los nombres de los ficheros generados sean diferentes en cada ocasión. Existen distintas formas de hacer esto. Os voy a contar mis dos favoritas con un ejemplo en el que volcamos en el fichero un listado con los procesos en ejecución en el momento de crearlo.

En el primer método creamos un fichero cuya marca distintiva es un número secuencial que empieza por el 0 y que se irá incrementando de 1 en 1. En este ejemplo los ficheros creados serán ps_0.txt, ps_1.txt, etc.

#!/bin/sh
cd /var/archivos/
numero=$(ls ps* | wc -l)
fichero=ps_$numero.txt
ps aux --sort -rss > $fichero

El segundo método usa una marca de tiempo que incluye año, mes, día, hora y minuto. Al generar el fichero en el momento de escribir este texto el nombre sería ps_20160401-17:55.txt

#!/bin/sh
cd /var/archivos/
fecha=`date +%Y%m%d-%H:%M`
fichero=ps_$fecha.txt
ps aux --sort -rss > $fichero

Script desatendido de conexión a un servidor FTP

Al contratar espacio de backup en la mayoría de las empresas de hosting la opción más habitual sigue siendo a través de FTP. Para automatizar las copias de forma desatendida necesitamos programar estas, habitualmente lanzando un script a través de cron. Si buscas un modelo para construir el tuyo puedes partir a través de este:

#!/bin/sh

HOST='ip_del_ftp_server'
USER='nombre_de_usuario'
PASSWD='password'

ftp -n -i $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
cd /file_backups
lcd /home/administrador/file_backups
mput *
cd /mysql_backups
lcd /home/administrador/mysql_backups
mput *
quit
END_SCRIPT
exit 0

El script supone que ya tenemos los ficheros que queremos copiar en dos directorios locales: /home/adminstrador/file_backups y /home/administrador/mysql_backups. Haremos la copia en dos directorios del servidor ftp que se llaman /file_backups y mysql_backups. Los parámetros -n y -i de la conexión al servidor desactivan, respectivamente, el autologin y el modo interactivo (para evitar que el servidor ftp nos pida confirmación en cada operación de copia).