Simulación de navegación manteniendo la sesión con wget
1. Introducción
Es habitual que en las tareas de mantenimiento de nuestros sistemas automaticemos procesos que realizamos todos los días. En este tutorial vamos a ver un ejemplo práctico donde necesitemos simular la navegación por un sitio web como si de un navegador se tratara utilizando el comando wget.
Imaginaros que tenemos contratado un hosting donde tenemos nuestra aplicación web y queremos automatizar la tarea de descarga del backup de nuestro schema de la base de datos. El proveedor habitualmente nos ofrece la herramienta «CPanel» para gestionar nuestro servidor y entre las opciones se encuentra la posibilidad de descargar el backup de la base de datos.
El problema es que para poder descargar el backup necesitamos previamente habernos logado con nuestro usuario en el CPanel lo que implica que tenemos que mantener la cookie de sesión entre una petición y otra. Gracias a wget este problema se resuelve ya que nos permite guardar y enviar las cookies entre diferentes peticiones.
A continuación os muestro un gráfico donde queda más claro el proceso que debe automatizar nuestro script.
2. Entorno
Entorno utilizado para escribir este tutorial:
- Hardware: Mac Book Pro (Core 2 Duo 2,8 Ghz, 4 GB RAM, 500 GB)
- Sistema Operativo: Ubuntu Server 64 bits
- Kernel: 2.6.35
3. Simulando la navegación con wget
Para aquellos que no lo sepáis el comando wget nos permite descargar contenidos de los servidores web de forma sencilla con solo poner la url (Por ejemplo «wget https://adictosaltrabajo.com/tutoriales/pdfs/spnego-spring.pdf»).
En nuestro caso lo vamos utilizar también para simular la navegación por un sitio web manteniendo las cookies de una petición a otra.
Para nuestro ejemplo, la primera petición que realicemos al servidor debe simular el envío del formulario de login por post y además guardar las cookies para mantener la sesión en las siguientes peticiones. Lo haremos de la siguiente forma:
wget "https://www.midominio.com/cpanel/login" --post-data "user=username&pass=password" --no-check-certificate --keep-session-cookies --save-cookies /tmp/cookies -S -O /dev/null
Con este comando lo que estamos diciendo a wget es que envíe una petición POST con los parámetros «user=username&pass=password» a la url https://www.midominio.com/cpanel/login, que no valide el certificado y que guarde las cookies en el fichero /tmp/cookies y ademas que la respuesta la guarde en /dev/null.
La siguiente petición será descargar nuestro fichero de backup utilizando las cookies de la primera petición.
wget "https://www.midominio.com/cpanel/backup.sql.gz" --no-check-certificate --keep-session-cookies --load-cookies /tmp/cookies
Aqui le estamos indicando a wget que se descargue el fichero https://www.midominio.com/cpanel/backup.sql.gz sin validar el certificado del servidor y que envíe al servidor las cookies almacenadas en el fichero /tmp/cookies.
Como habéis podido ver con estos dos sencillos comandos hemos conseguido la descarga de un fichero en la zona privada de un web.
Ahora vamos a realizar un Shell Script que nos automatice la descarga.
USER="username" PASSWD="password" URL="https://www.midominio.com/cpanel" PATH_FILE_COOKIE=cookie_midominio BACKUP_DB="getsqlbackup" DIR_BACKUP_DB=/var/backups SCHEMA_DB="schema.sql.gz" BACKUP_FILE="$BACKUP_DB/$SCHEMA_DB" echo "stating $URL backup" echo "Log in in Cpanel" wget "$URL/login" --post-data "user=$USER&pass=$PASSWD" --no-check-certificate --keep-session-cookies --save-cookies $PATH_FILE_COOKIE -S -O /dev/null echo "downloading sql file: $BACKUP_FILE" wget "$URL/$BACKUP_FILE" --no-check-certificate --keep-session-cookies --load-cookies $PATH_FILE_COOKIE= cp $SCHEMA_DB $DIR_BACKUP_DB rm $PATH_FILE_COOKIE echo "done"
Y por último si queremos que se ejecute todos los días tendremos que configurar el crontab en nuestra máquina pero este paso ya lo hacéis vosotros.
4 Conclusión
Como habéis podido ver automatizar ciertos procesos que implican navegación por la zona privada de una aplicación web es relativamente sencillo con wget y el poder del Shell Script.