Pure Bash Servidor web ligero.
¡Solución fácil para configurar un sitio web local sin ninguna configuración del servidor!
Esto está inspirado en Bashttpd. Sin embargo, el comportamiento es completamente diferente. Vea a continuación para más información.
Presentación
Cómo usar
Cómo usar (experto)
Ejemplo
Sobre la seguridad
¿Por qué Sherver?
¿Licencia?
Solo clon y ejecute ./sherver.sh . Luego, debería poder conectarse a Localhost: 8080. Puede pasar el puerto para escuchar como parámetro: ./sherver.sh 8080 (el valor predeterminado es 8080 ).
Esto está hecho para funcionar con Bash . Puede que no funcione en otro caparazón. Las siguientes herramientas deben estar presentes en el sistema (tenga en cuenta que todas son parte de la instalación predeterminada de Debian):
envsubst si quieres hacer plantillassocat para ejecutar el servidor.netcat en su lugar, pero no funciona bien con las solicitudes HTTP concurrentesSherver es un servidor web que implementa parte de HTTP 1.0. Incluso si está escrito en unas pocas líneas de Bash, puede hacer mucho:
scripts o en carpetas filestdoutTodo esto hace que Sherver sea la herramienta perfecta para ejecutar un pequeño servidor que sirva a pocas páginas en su red local.
Incluso si suena increíble, Sherver todavía tiene las siguientes limitaciones:
Es por eso que se supone que Sherver permanece en un entorno privado y controlado. ¡No exponga al Sherver en Internet! Si desea exponer su sitio en Internet, debe usar una herramienta que conozca la seguridad y la concurrencia (como Nginx u otro).
Siempre ejecute Sherver detrás de un firewall que evite las intrusiones del exterior .
Documentación rápida sobre cómo usar Sherver para su propio uso. Todas las variables y funciones mencionadas aquí tienen una descripción completa en scripts/readme.md.
Lo más simple que puede hacer es servir páginas estáticas: archivos HTML puros que no necesitan ningún procesamiento.
Para hacerlo, solo necesita colocar sus archivos HTML en el archivo/páginas del subdirectorio. Luego, puede acceder a sus páginas a través de una URL como /file/pages/index.html (si su nombre de archivo es index.html , por ejemplo).
Tenga en cuenta que tendrá que dar el nombre de archivo completo en la URL para que Sherver pueda encontrarlo.
¡Es tan simple como eso! Si Sherver puede encontrar el archivo, lo servirá. De lo contrario, devolverá un error 404.
Puede servir cualquier tipo de archivos de Sherver. Desde texto, como CSS o JavaScript hasta binarios como imágenes, videos, zip ...
Simplemente coloque los archivos en el archivo subdirectorio. Luego puede hacer referencia a ellos a través de una URL como /file/venise.webp . Tenga en cuenta que es preferible dar ruta completa en lugar de rutas relativas.
Sherver servirá automáticamente al archivo si puede encontrarlo, con el tipo MIME correcto. Incluso permitirá que el navegador almacene en caché el archivo, y solo lo servirá nuevamente si el archivo ha cambiado. Si Sherver no puede encontrar el archivo, devolverá un error 404.
Para recursos, como CSS, JavaScript, Favicon ... es mejor ponerlos en el archivo/recursos de subcarpeta, aunque no tiene que hacerlo.
Ejemplo sobre cómo vincular un archivo CSS:
< link rel =" stylesheet " type =" text/css " href =" /file/resources/ugly.css " >Ejemplo sobre cómo integrar una imagen en su HTML:
< img src =" /file/venise.webp " alt ="" >Aquí es donde Sherver se vuelve útil: puede servir páginas dinámicas, construidas del lado del servidor según el contexto.
Para hacerlo, solo necesita agregar ejecutables en los scripts de subcarpeta. Los ejecutables pueden ser de cualquier tipo (script bash, script de python, cualquier otro script, cualquier binario como C ++ compilado ejecutable ...) tan pronto como Sherver pueda ejecutarlo (debe tener el conjunto de indicadores executable ).
Tan pronto como tenga un ejecutable allí, Sherver lo ejecutará y cumplirá su salida. Tenga en cuenta que index.sh es un nombre particular, ya que es el que será ejecutado por el despachador si accede a la raíz del sitio web (consulte la sección del despachador a continuación). Si Sherver no puede ejecutar ningún archivo, devolverá un error 404. Si el ejecutable falla (el código de retorno no es 0 ), devolverá un error 500.
Para vincular un ejecutable, debe omitir los scripts de carpeta en la url: /page.sh buscará el ejecutable ./scripts/page.sh .
El ejecutable se ejecuta desde la carpeta scripts .
Guiones
Sherver está hecho principalmente para trabajar con scripts bash. Si crea un script bash, lo primero que debe hacer es ejecutar la función init_environment . Luego tendrá acceso a todas las siguientes variables:
REQUEST_FULL_STRINGREQUEST_METHODREQUEST_URLREQUEST_HEADERSREQUEST_BODYURL_BASEURL_PARAMETERSDATERESPONSE_HEADERSHTTP_RESPONSEY también muchas funciones útiles como:
add_headersend_responsesend_filesend_error Consulte toda la documentación sobre la biblioteca SHERVER_UTILS.sh en scripts/readme.md.
Todo lo escrito en la salida estándar se enviará al cliente. Aquí hay un script muy simple que devuelve las solicitudes en un formato de texto:
#! /bin/bash
init_environment
if [ " $REQUEST_METHOD " != ' GET ' ] ; then
send_error 405
fi
add_header ' Content-Type ' ' text/plain '
send_response 200 " $REQUEST_FULL_STRING "Cualquier otro script o binarios
Si no usa Bash, solo tendrá acceso a la variable de entorno REQUEST_FULL_STRING que contiene la solicitud completa como una cadena. La URL solicitada ( REQUEST_URL ) se aprobará como primer argumento.
Todo lo escrito en la salida de StandAr se enviará al cliente. Sin embargo, debe escribir los encabezados de la respuesta usted mismo.
Para los scripts bash, hay un motor de plantilla básico integrado con Sherver (LOL). En realidad, usa envsubst para reemplazar cualquier ocurrencia de $VARIABLE por la variable del entorno si lo existe.
Puede colocar sus plantillas en los scripts/plantillas de subcarpeta, aunque no es obligatorio.
Aquí hay una plantilla para una template.txt de archivo de texto.txt (que mejora nuestro ejemplo de script bash anterior):
You entered the following request:
$REQUEST
Y lo usarías con el siguiente script:
#! /bin/bash
init_environment
if [ " $REQUEST_METHOD " != ' GET ' ] ; then
send_error 405
fi
REQUEST= " $REQUEST_FULL_STRING "
# put REQUEST in the environment so we can use it in our template
export REQUEST
# load the template
response= $( envsubst < ' templates/template.txt ' )
add_header ' Content-Type ' ' text/plain '
send_response 200 " $response "Ejemplo de HTML completo en el ejemplo a continuación.
Las solicitudes de publicación son compatibles. Puede verificar el valor de la variable REQUEST_METHOD que se GET o POST , para que pueda tener un comportamiento diferente en función del tipo de solicitud.
El contenido de la solicitud de publicación se puede retirar en la variable REQUEST_BODY . Si el cliente codifica los datos, puede usar la función parse_url con algunos trucos para obtener una matriz asociativa de los parámetros.
Cualquier contenido puede ser devuelto al cliente. Puede agregar el tipo de MIME correcto gracias al método add_header .
Todas las variables y funciones mencionadas aquí tienen una descripción completa en scripts/readme.md.
Se puede registrar cualquier cosa escrita al error estándar. Para aliviar los registros, puede usar el log de funciones.
Para mantener los registros en un archivo, puede redirigir la salida de error de sherver.sh en un archivo:
./sherver.sh 2> logs.txtPor defecto, los encabezados de las solicitudes y las respuestas están registradas, pero no los cuerpos.
El despachador es responsable de pedir servir un archivo o ejecutar un script, dependiendo del UTL solicitado. Se implementa en File Dispatcher.sh.
Actualmente tiene 4 acciones:
/ ), ejecuta el script scripts/index.shindex.htm o index.html , ejecuta el script scripts/index.sh/file/ , sirve al archivo solicitado/test/dummy.sh ejecutará el script scripts/test/dummy.sh si existe).Todos estos comportamientos se pueden cambiar editando el archivo despachador.sh.
En primer lugar, debe crear un usuario específico que ejecute sherver.sh con bajos privilegios. Llamaremos a nuestro usuario sherver y pondremos todo el sitio web en su directorio Hone.
Necesitamos agregar a nuestro usuario a los grupos sudo y netdev , por lo que puede administrar la VPN (obviamente no es una buena idea darle sudo al usuario, es por eso que no debe exponer el sitio web en Internet).
useradd -mUG sudo,netdev -s /usr/bin/bash sherver
passwd sherver
... Tenga en cuenta que puede agregar a su usuario actual al grupo sherver por razones prácticas (tendrá que relajarse para que sea efectivo):
adduser USER sherverAhora, obtengamos el sitio web en su directorio de inicio
su sherver
cd ~
git clone https://github.com/remileduc/sherver.git
cd sherver
git checkout perso Finalmente, debemos habilitar el servicio para que comience sherver.sh automáticamente. Para hacerlo, copie el archivo sherver.service en /usr/share/systemd/ y luego habilite el servicio:
cp sherver.service /usr/share/systemd/
ln -s /usr/share/systemd/sherver.service /etc/systemd/system/sherver.service
systemctl daemon-reload
systemctl enable sherver.servicePuede ver como ejemplo los scripts que uso en casa para administrar mi VPN. Es accesible en la rama Perso. Tenga en cuenta que necesita el script vpn-mgr.sh para poder usarlo correctamente.
Ver Bashttpd. Es obvio decir que esto viene sin ninguna característica de seguridad. No exponga al Sherver en Internet .
Si necesita exponer el sitio en Internet, necesita un servidor real que se haya construido especialmente para enfrentar todos estos problemas.
Sin embargo, es perfecto para usar en una red local. Será tan seguro como su conexión WiFi y su firewall.
Quería configurar rápidamente un servidor que sirviera páginas dinámicas, y que pudiera ejecutar algunos scripts bash, para controlar mi centro de medios a través de páginas web.
No quería instalar y configurar Apache o Nginx. De hecho, no quería ninguna configuración.
Sherver puede ejecutarse sin ninguna configuración. Solo necesita agregar archivos en el lugar correcto. Puede ejecutarse sin nada que se instale (todas las herramientas utilizadas son parte de la instalación predeterminada de Debian, excepto tal vez para SOCAT).
Puedes ver mi caso de uso en la rama perso .
Todo está bajo la licencia MIT.
Utilizamos el script mimetype , enviado en scripts/utils/mimetype, que está bajo la licencia Perl.