Publi

Mini servidor web con Bash y netcat para páginas en mantenimiento

Foto: MTSOfan (Flickr CC-by)

Cuando estamos trabajando en un servidor web, sobre todo si ya está siendo usado y hay páginas alojadas en él, y necesitamos irremediablemente pararlo todo para trabajar no podemos dejarlo todo tirado esperando que los usuarios no se enfaden (y peor, esperando que los buscadores no se enfaden, porque la ley de Murphy dice que aunque pares el servidor 10 minutos, va a venir Google a rastrear la página y colocar en tu resumen un precioso:

…y cargarse todo el SEO de la página.

Montar un pequeño servidor para servir una página

A veces no podemos utilizar nuestro servidor principal, ya que estamos cambiándolo, actualizándolo, peleándonos con dependencias o trabajando en configuración o plug-ins. Por lo que necesitamos algo para reemplazarlo momentáneamente.

Tampoco queremos algo demasiado grande porque es para un apaño. Tal vez no tengamos nodeJs instalado, o python en los que nos podemos crear un servidor web con pocas líneas. Y tampoco queremos tener que instalar demasiadas cosas.

Mi propuesta es, usar netcat (viene instalado por defecto en muchas distribuciones, de todas formas, no tiene dependencias apenas.

Sólo tenemos que ejecutar lo siguiente:

1
$ sudo -c sh 'while true; do nc -l -p 80 < respuesta.html; done'

Sin sudo y con usuario root si no disponemos de él en el sistema. Con esto, vamos a poner constantemente en escucha el puerto 80 y procesando todas las peticiones de la misma forma, devolviendo los contenidos de respuesta.html.

Recordad, las pruebas podemos hacerlas como un usuario normal (no root) si utilizamos un puerto mayor de 1024, por ejemplo el 8000, 8080, 1234, etc:

1
$ while true; do nc -l -p 8000 < respuesta.html; done

Como la respuesta debe ser muy rápida, en principio no tenemos necesidad de algo más complicado (esperemos que no vengan demasiadas visitas mientras trabajamos). Pero este sistema no soportará usuarios concurrentes, recordemos que es sólo un servidor temporal y puede que a algún usuario le dé algún problema en conectar. Podemos guardar un registro de todo lo que ha pasado con:

1
$ sudo -c sh 'while true; do nc -l -p 80 < respuesta.html; done > log'

o como usuario

1
$ while true; do nc -l -p 8000 < respuesta.html; done > log

Creando respuesta.html

Como habrás podido ver respuesta.html no es un archivo HTML normal, en realidad aquí hay que poner toda la respuesta completa (con cabeceras incluidas), podemos hacer algo sencillo primero:

1
2
3
4
5
6
7
8
9
10
11
HTTP/1.1 200 OK
Server: LittleServer
Content-Type: text/html;charset=UTF-8

<html>
<body>
<h1>Lo sentimos, estamos de mantenimiento</h1>
Disculpe las molestias, en un momento estaremos con usted.

</body>
</html>

La página a partir de la etiqueta <html>, podemos poner el código HTML que queramos. Aunque ahora estaremos contestando con un código de salida exitoso, lo que significa que los usuarios no se cabrearán (bueno sí, pero al menos verán una explicación), pero los buscadores y robots sí que la tomarán con nosotros, porque se creerán que ésta es la página buena, es más todas las páginas del servidor responderán lo mismo.

Respondiendo para que los buscadores no nos tengan en cuenta

Para ello tenemos que poner en nuestra cabecera un error 503 (Servicio no disponible). Esto será bueno porque no devolveremos un 200 (OK) para las páginas temporales, ni devolveremos un 404 (Not found / No encontrado) para el resto de páginas que no estén en nuestro servidor pero si deberán estar y el buscador de turno lo sabe (esto último sería horrible para nuestro posicionamiento, porque el buscador se creería que esas páginas ya no existen y las desindexará).

Para ello, nuestro archivo de respuesta.html será el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 503 Service Unavailable
Server: Maintenance
Retry-After: 3600
Content-Type: text/html;charset=UTF-8

<html>
<body>
<h1>Lo sentimos, estamos de mantenimiento</h1>
Disculpe las molestias, en un momento estaremos con usted.

</body>
</html>

Además, añadiremos Retry-After para que vuelvan dentro de un rato a ver si todo está bien. No se garantiza que los buscadores vuelvan dentro de una hora (3600 segundos), pero es normal que vuelvan cuando tengan un rato después de una hora.

Queremos complicarnos la vida

Si has llegado hasta aquí, eres de los que le gustan complicarse la vida e inventar cosas (como yo), así que, para dejar un poco a la imaginación y para hacer un servidor web un poco más completo (sin salirnos de esta base).
Vamos a crear un script que procesará la petición HTTP que se realice (tenemos que recordar que cuantas más cosas metamos, más vulnerable será nuestro sistema, y un script aquí es tremendamente vulnerable.

dispatcher.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
I=0
while read RAWINPUT; do
        if [ ${#RAWINPUT} -le 1 ]
        then
                break
        fi
        INPUT[$I]=$RAWINPUT
        I=$(($I+1))
done

read -a FIRSTLINE <<< ${INPUT[0]}
METHOD=${FIRSTLINE[0]}
REQUEST=${FIRSTLINE[1]}
HTTPVER=${FIRSTLINE[2]}

echo $HTTPVER 503 Service Unavailable
echo "Retry-After: 3600"
echo "Server: Bash-Maintenance"
case "$REQUEST" in
        "/logo.jpg")
                FILE="my-logo-file.jpg"
                echo "Content-Type: image/jpeg"
                echo "Content-Length: "$(stat -c%s "$FILE")
                echo
                cat $FILE
        ;;
        "/fortune")
                CONTENT=$(fortune)
                echo "Content-Type: text/html; charset=utf-8"
                echo "Content-Length: "${#CONTENT}
                echo
                echo $CONTENT
        ;;
        *)
                FILE="respuesta.html"
                echo "Content-Type: text/html; charset=utf-8"
                echo "Content-Length: "$(stat -c%s "$FILE")
                echo
                cat $FILE
        ;;
esac

Ahora tenemos 3 respuestas posibles:

  • Una para una imagen que llamaremos a través de http://nuestroservidor/logo.jpg y que llamará a la imagen my-logo-file.jpg
  • Otra que llamará al programa fortune, para que nos devuelva una frase aleatoria.
  • Otra que atenderá todas las demás peticiones (*) y servirá el archivo respuesta.html

Para hacer que netcat utilice este archivo, depende de la versión, por un lado podemos llamar a:

1
$ sudo sh -c 'while true; do nc -v -l -p 80 -c dispatcher.sh; done'

como usuario,

1
$ while true; do nc -v -l -p 8000 -c dispatcher.sh; done

Aunque en muchas versiones de GNU/Linux viene otra versión instalada que no soporta -c, pero no todo está perdido:

1
$ rm /tmp/bashwebtmp; mkfifo /tmp/bashwebtmp; sudo -c sh 'while true; do cat /tmp/f | bash dispatcher.sh | nc -v -l -p 80 > /tmp/f; done';

como usuario,

1
$ rm /tmp/bashwebtmp; mkfifo /tmp/bashwebtmp; while true; do cat /tmp/f | bash dispatcher.sh | nc -v -l -p 8000 > /tmp/f; done;

No debemos olvidar borrar la pipe /tmp/bashwebtmp cuando terminemos de usar el programa.

Una cosa más, no debemos abusar de este script y no debemos enviar contenidos muy grandes, por ejemplo, no abusar de las imágenes (yo recomiendo enlazarlas de otro servidor que sí funcione, para ir más rápido aún), como decía antes, sólo soporta una conexión, si hacemos que esta conexión se extienda en el tiempo perderemos capacidad de atender más conexiones.

Actualización: 24/11/2016: Arregladas algunas etiquetas HTML que no se veían bien.

También podría interesarte....

There are 11 comments left Ir a comentario

  1. Pingback: Mini servidor web con Bash y netcat para páginas en mantenimiento | PlanetaLibre /

  2. Pingback: Pseudo servidor web con bash y netcat | El Blog de Sinfallas /

  3. yitzchak kerrigan /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I remember the first time I tried on diabetic socks. I had been struggling with foot pain and swelling for months, and nothing seemed to bring me relief. But as soon as I slipped on those specially designed socks, I felt an immediate difference. The cushioned soles provided support and comfort that regular socks couldn’t offer, and the non-binding tops allowed my circulation to improve, reducing the swelling in my feet. From that day on, diabetic socks became a staple in my wardrobe, helping me manage my diabetes-related foot issues and allowing me to live more comfortably every day. comfortable socks

  4. ghori92 /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    hi was just seeing if you minded a comment. i like your website and the thme you picked is super. I will be back. изработка на сайтове

  5. alam alam /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I merely imagined it usually is a perception to write could possibly help anybody ended up being experiencing difficulity looking into nevertheless We are somewhat doubtful only are permitted to placed labels along with details in below. UFABETกติกาแทงบอล

  6. MUZAMMIL SEO MUZAMMIL SEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I am continually amazed by the amount of information available on this subject. What you presented was well researched and well worded in order to get your stand on this across to all your readers. สมัครเว็บแทงบอลตรงUFABETยังไง

  7. ALEXENDER RAVI /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work!. UFABETเข้าสู่ระบบไม่มีค่าธรรมเนียม

  8. MUZAMMIL SEO MUZAMMIL SEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I recently came across your blog and have been reading along. I thought I would leave my first comment. I don’t know what to say except that I have enjoyed reading. UFABETสมัครแทงบอลคาสิโนออนไลน์

  9. ghori92 /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I am impressed. I don’t think Ive met anyone who knows as much about this subject as you do. You are truly well informed and very intelligent. You wrote something that people could understand and made the subject intriguing for everyone. Really, great blog you have got here. city of stanton

  10. Karter221 /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I got what you mean , thanks for posting .Woh I am happy to find this website through google. UFABETรับเครดิตฟรีแจกโบนัสเยอะ

  11. Karter221 /
    Usando Google Chrome Google Chrome 121.0.0.0 en Windows Windows NT

    I exactly got what you mean, thanks for posting. And, I am too much happy to find this website on the world of Google. 강릉 타이마사지

Leave a Reply