@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.
- 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.
- 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
- 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
- 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.
- 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. : )