Utilizar Shell Scripts para ejecutar Aplicaciones Web (ayuda)

Como el título intenta indicar: necesito saber si es posible usar shell scripts para ejecutar aplicaciones web.

Me explico mejor, que alguno debe estar ya convulsionando:

Pensando en algún pequeño proyecto en el que invertir mi escaso tiempo, se me ha pasado por la cabeza hacer una pequeña web (HTML y CSS a lo “guarro”) para crear una especie de foro en el que charlar con mis compas de clase (todo esto en red local, sin dominios ni ostias).

Estaba por descartar la idea debido a mi escaso conocimiento en bases de datos y en algún lenguaje como PHP o JS para manejar las simples funciones que tendría el sitio web, cuando se me ha ocurrido la idea de almacenar los comentarios de la gente en archivos .txt y administrarlos y mostrarlos con shell scripts (es ridículo, lo sé, pero es lo que se me ha ocurrido).

Investigando por internet, solo he encontrado la siguiente web que da un poco de luz a mi proyecto. No es exactamente lo que busco, pero es un inicio: URL

A mí me gustaría, por ejemplo, que al pulsar un botón se muestre cierta información. Es decir, que el usuario, al interactuar con la página, pueda ejecutar diferentes scripts.

Mirándolo desde otro punto de vista, la pregunta se puede plantear de la siguiente manera: ¿Se puede usar HTML como interfaz gráfica para Shell Scripts

No sé si me he dado a entender, es una idea abstracta que tengo en la cabeza y me cuesta transcribirla… Mis disculpas por eso.

Tampoco sé si esta es la categoría correcta; no estoy muy seguro si encajaría mejor en software o principiantes…

Ojalá algún veterano con conocimiento pueda iluminarme un poquito. : )

2 Me gusta

A ese punto, te recomiendo usar Python como backend para ese fin. Python cuenta con muchas librerías para desarrollo web, te permite almacenar en bases de datos y también te permite manipular archivos de texto. Todo lo que quieras inventar como medio de comunicación, puede conseguirse con Python y de manera muy sencilla.

1 me gusta

Mirá, pensando un poco en tu proyecto, te va a convenir utilizar un único dispositivo como servidor, en él, puedes usar SQLite3 como base de datos, ya que es un archivo simple sin seguirdad en el que se puede almacenar información de manera muy sencilla. En el dispositivo servidor, podés crear múltiples usuarios con acceso a dicho script de Python o Bash en donde se pueda ejecutar una instancia por usuario. De esa manera, cada usuario se puede conectar vía SSH y ejecutar el script para chatear y tener acceso en tiempo real a lo que se escribe.

1 me gusta

Te contesto por partes, @5ombr4:

A la primera propuesta:

Sí, lo he considerado, pero a pesar de tener una pequeña base en Python, no tengo el conocimiento suficiente, y sinceramente no me quiero volver loco con este ‘proyecto’. Los scripts en Bash los controlo mejor, y además ahora me apetece hacerlo de este modo (cabezonería pura).

En fin, que tienes razón, sería más eficiente y simple, pero me gustaría saber si hay forma de hacerlo como yo lo planteo…

A la segunda:

Lo de SQLite3 es muy buena idea; investigaré, porque sinceramente no tengo ni idea.
Lo de un unico dispositibo como servidor desde luego, tenia pensado un ubuntu server con Apache o algo asi simple.
Aunque lo de la conexión por SSH me parece más complicado para un usuario corriente, yo busco algo más simple, sin optimización ni seguridad…

Gracias por tus consejos, realmente los aprecio. Un saludo! : )

No, para nada es un problema y ojalá puedas encontrar la solución justa para tus necesidades.
Sin embargo, hay un par de cosas en las que le voy a atrever a advertir y es que no he visto proyecto web que use bash scripting como backend salvo que el script sea invocado por otro lenguaje como Python, PHP o Javascript, de hecho, en mi experiencia con bash y como desarrollador web, no he visto manera de obtener información de un campo HTML o rellenado el mismo usando bash. En el caso de Python es distinto por su flexibilidad, es un lenguaje de scripting muy flexible que ofrece soluciones a múltiples propósitos, por lo que tiene su framework backend (Django) y permite guardar información ya sea en .xlsx, SQLie3, .txt o MySQL y no necesita más que una sola línea de codigo para hacerlo.
Quizás te convenga usar un lenguaje de backend de manera básica para que sirva de puente entre HTML y bash.

Toda la razón @5ombr4, cuanto más investigo más negro lo veo, voy a intentarlo durante un par de días, y a una mala me pongo con Python o simplemente php

Si consigo lo del bash actualizo este post : )

1 me gusta

Si, me interesa mucho saber si es posible. Muchas gracias.

@Sugoli15 por poder claro que puedes hacerlo. Ningún problema.

Todo depende de cuál es tu objetivo.

BASH, como leguaje de programación es muy limitado para lo que quieres hacer, hay mejores opciones. BASH es limitado porque su finalidad es ser el pegamento que une las aplicaciones basicas de un sistema operativo, del lado del usuario. Vamos, para hacer tareas administrativas del sistema operativo.

Para manejar el backend (bases de datos) y el frontend ( html, etc) te va resultar complicado pero no imposible. Si tu objetivo es aprender BASH en modo avanzado, con ese proyecto vas a aprender bastante de BASH.

Si tu objetivo es ceñirte al proyecto tienes mejores opciones. Las más usadas son PHP o Python, como menciona @5ombr4.

Python tiene la ventaja de tener frameworks que te pueden ser útiles para tu proyecto. Te dejo enlaces para los más minimalistas:

https://flask.palletsprojects.com/en/3.0.x/

Y este:

Espero que te sea útil.

1 me gusta

@5ombr4 ¡Lo he conseguido!

Debido a mi escaso conocimiento, lo voy a explicar lo mejor que pueda;

Ten en cuenta que la situación en la que lo he conseguido es muy concreta; no he pasado mucho tiempo probando diferentes posibilidades ni diferentes entornos.

  1. Lo primero es que sí o sí necesitas un servidor web que corra sobre Linux, ya que el código bash se ejecuta en el servidor y luego se muestra en la página web.
    En mi caso, yo solo lo he probado en un Ubuntu 18.04.6, con Apache2, y además HTTP, todo predeterminado y sin reparar en seguridad ni permisos.
  2. Lo segundo es que tienes que configurar el servidor web para que sea capaz de interpretar la salida del Shell Script como código HTML. Para ello necesitas la tecnologia CGI (Common Gateway Interface).
    En mi caso, yo he escrito el siguiente comando para habilitarlo en apache:
~$ sudo a2enmod cgid
  1. Luego tendrás que configurar el archivo .htaccess, el cual debería estar en /usr/lib/cgi-bin/, y si no está, lo creas. Debes escribir el siguiente texto: (sinceramente, ni idea de lo que es).
AllowOverride None
Options +ExecCGI
AddHandler cgi-script .sh
Require all granted
  1. Por último, y en teoría, los scripts que estén en esa carpeta (/usr/lib/cgi-bin/), con permisos de ejecución y que tengan como salida código HTML, deberían poder ejecutarse y verse en una página HTML.
  2. Importante recordar que al inicio del script tienes que poner el siguiente comando:
echo "Content-type: text/html"

Funcionamiento y comportamiento general de los scripts con esta tecnología:

Lo primero es que es extremadamente engorrosa de escribir, en serio, solo recomendable para apaños simples y momentáneos.

Dejo el código de un hola mundo:

#!/bin/bash
echo "Content-type: text/html"
echo ""
texto="Hola Mundo!"
echo "<html><body>"
echo "<p>$texto</p>"
echo "</html></body>"

También es posible enseñar el resultado de algún comando de la siguiente manera:

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><body>"
echo "<p>Hora actual: $(date +"%H:%M:%S")</p>"
echo "</html></body>"

Y puedes meter estructuras que permiten controlar el flujo de ejecución, como if, for, métodos

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><body>"
for i in {1..10}; do
    echo "<p>Ejecucion numero $i</p>"
done
echo "</html></body>"

También puedes recibir datos de un formulario HTML vía POST; sería algo así:
meterNombre.html:

<!DOCTYPE html>
<head>
    <title>Formulario a Bash</title>
</head>
<body>
    <form action="enseñar.sh" method="POST">
        <label for="nombre">Nombre:</label>
        <input type="text" id="nombre" name="nombre" >
        <label for="apellido">Apellido:</label> 
        <input type="text" id="apellido" name="apellido">
        <input type="submit" value="Enviar">
    </form>
</body>
</html>

enseñar.sh:

#!/bin/bash

echo "Content-type: text/html"
echo ""

recibido=$(cat)

echo "<html><body>"
echo "<p>Texto recibido: $recibido</p>"
echo "</html></body>"

Que se vería algo así: Texto recibido: nombre=Pepito&apellido=Grillo.
Para poder descomponer eso en los datos que queremos, tendríamos que hacer un algoritmo que separara la secuencia de caracteres en diferentes variables. Yo he hecho lo siguiente:

#!/bin/bash

echo "Content-type: text/html"
echo ""

recibido=$(cat)

urldecode() {
    local encoded="$1"
    local decoded="${encoded//+/ }"
    printf '%b' "${decoded//%/\\x}"
}

IFS='&' read -ra params <<< "$recibido"

nom=""
ape=""

for param in "${params[@]}"; do
    key="${param%%=*}"
    value="${param#*=}"
    value=$(urldecode "$value") 

    if [ "$key" == "nombre" ]; then
        nom="$value"
    elif [ "$key" == "apellido" ]; then
        ape="$value"
    fi
done

echo "<html><body>"
echo "<p>Nombre: $nom</p>"
echo "<p>Apellido: $ape</p>"
echo "</html></body>"

Para utilizar este algoritmo con más elementos, simplemente inicializa las variables que necesites y crea más elif.

Y por ahora, esto es todo lo que puedo aportar. Sinceramente, es muy tedioso y nada eficiente, pero bueno, siempre es bueno saber más…

Me gustaría remarcar que no soy conocedor en la materia, que hay muy poca información en la red y que estos ejemplos me han funcionado en un entorno muy concreto (el que anteriormente he descrito).

Espero que le sirva a alguien. Un saludo. : )

2 Me gusta

Uffff… La lectura de esta noche va a estar interesante.
Muchísimas gracias por compartir esto. Voy a explorar esta posibilidad ya que parece útil para algunos casos de uso.

1 me gusta

Si tienes alguna duda que no encuentres por ahí, estaré encantado de intentar contestarte, aunque no creo que pueda ir mucho más lejos de lo que ya he escrito.
Un saludo, siempre es un placer que a alguien le interese lo que escribes!

1 me gusta

Woow, esta genial, una de las ventajas de apache es que lo pudes poner a ejecutar prácticamente cualquier lenguaje, por ejemplo python.

Tu proyecto parece engorroso, pero para mi sería algo sumamente entretenido y didáctico, creo que para hacerlo más manejable y modular podrías usar scripts aparte que se encarguen de generar el html y los scripts principales qué se encarguen de llamarlos y mostrarlos de acuerdo al fijo de ejecución.

Es tan interesante que cabe la posibilidad que sea una alternativa en casos específicos como una máquina de muy pocos recursos o donde directamente no se pueda usar un lenguaje de backend por la razón que sea.

El tema es que no solo puedes usar html, también css y javascript.

Ojalá sigas madurando la idea, esta genial felicitaciones.

1 me gusta