Serveur Web pur bash léger.
Solution facile pour configurer un site Web local sans aucune configuration de serveur !!!
Ceci est inspiré par Bashttpd. Cependant, le comportement est entièrement différent. Voir ci-dessous pour plus d'informations.
Présentation
Comment utiliser
Comment utiliser (expert)
Exemple
À propos de la sécurité
Pourquoi Sherver?
Licence?
Il suffit de clone et de courir ./sherver.sh . Ensuite, vous devriez pouvoir vous connecter à LocalHost: 8080. Vous pouvez passer le port pour écouter comme un paramètre: ./sherver.sh 8080 (par défaut est 8080 ).
Ceci est fait pour fonctionner avec Bash . Cela peut ne pas fonctionner dans un autre coquille. Les outils suivants doivent être présents dans le système (notez qu'ils font tous partie de l'installation par défaut de Debian):
envsubst si vous voulez faire des modèlessocat pour exécuter le serveur.netcat à la place, mais cela ne fonctionne pas bien avec les demandes HTTP simultanéesSherver est un serveur Web qui implémente une partie de HTTP 1.0. Même s'il est écrit en quelques lignes de bash, il est capable de faire beaucoup:
scripts ou dans les dossiers filestdoutTout cela fait de Sherver l'outil parfait pour exécuter un petit serveur qui servira quelques pages sur votre réseau local.
Même si cela semble génial, Sherver a toujours les limites suivantes:
C'est pourquoi Sherver est censé rester dans un environnement privé et contrôlé. N'exposez pas Sherver sur Internet !!! Si vous souhaitez exposer votre site sur Internet, vous devez utiliser un outil qui connaît la sécurité et la concurrence (comme Nginx ou autre).
Faites toujours passer un Sherver derrière un pare-feu qui empêche les intrusions de l'extérieur .
Documentation rapide sur la façon d'utiliser Sherver pour votre propre usage. Toutes les variables et fonctions mentionnées ici ont une description complète dans Scripts / Readme.md.
La chose la plus simple que vous puissiez faire est de servir des pages statiques: des fichiers HTML purs qui n'ont besoin d'aucun traitement.
Pour ce faire, il vous suffit de mettre vos fichiers HTML uniquement dans le fichier / pages du sous-répertoire. Ensuite, vous pouvez accéder à vos pages via une URL comme /file/pages/index.html (si votre nom de fichier est index.html par exemple).
Notez que vous devrez donner le nom de fichier complet dans l'URL afin que Sherver puisse le trouver.
C'est aussi simple que ça! Si Sherver peut trouver le fichier, il le servira. Sinon, il renverra une erreur 404.
Vous pouvez servir tout type de fichiers de Sherver. De Text comme CSS ou JavaScript à des binaires comme les images, les vidéos, le zip ...
Mettez simplement les fichiers dans le fichier de sous-répertoire. Vous pouvez ensuite les référencer via une URL comme /file/venise.webp . Notez qu'il est préférable de donner un chemin complet plutôt que des chemins relatifs.
Sherver servira automatiquement le fichier s'il peut le trouver, avec le type de mime correct. Il permettra même au navigateur de mettre en cache le fichier et ne le servira à nouveau que si le fichier a changé. Si Sherver ne trouve pas le fichier, il renverra une erreur 404.
Pour les ressources, comme CSS, JavaScript, Favicon ... il vaut mieux les mettre dans le fichier / ressources du sous-dossier, bien que vous n'ayez pas à le faire.
Exemple sur la façon de lier un fichier CSS:
< link rel =" stylesheet " type =" text/css " href =" /file/resources/ugly.css " >Exemple sur la façon d'intégrer une image dans votre HTML:
< img src =" /file/venise.webp " alt ="" >C'est là que Sherver devient utile: il peut servir des pages dynamiques, du côté serveur construit en fonction du contexte.
Pour ce faire, il vous suffit d'ajouter des exécutables dans les scripts du sous-dossier. Les exécutables peuvent être de n'importe quel type (script bash, script python, tout autre script, tout binaire comme exécutable compilé C ++ ...) dès que Sherver peut l'exécuter (il doit avoir le jeu d'indicateur executable ).
Dès que vous y avez un exécutable, Sherver l'exécutera et servira sa sortie. Notez que index.sh est un nom particulier car c'est celui qui sera exécuté par le répartiteur si vous accédez à la racine du site Web (voir la section Dispatcher ci-dessous). Si Sherver ne peut exécuter aucun fichier, il renverra une erreur 404. Si l'exécutable échoue (le code de retour n'est pas 0 ), il renverra une erreur de 500.
Pour lier un exécutable, vous devez omettre les scripts du dossier dans l'URL: /page.sh recherchera l'exécutable ./scripts/page.sh .
L'exécutable est exécuté à partir du dossier scripts .
Scripts bash
Sherver est principalement conçu pour travailler avec des scripts bash. Si vous créez un script bash, la première chose que vous devez faire est d'exécuter la fonction init_environment . Ensuite, vous aurez accès à toutes les variables suivantes:
REQUEST_FULL_STRINGREQUEST_METHODREQUEST_URLREQUEST_HEADERSREQUEST_BODYURL_BASEURL_PARAMETERSDATERESPONSE_HEADERSHTTP_RESPONSEEt aussi de nombreuses fonctions utiles comme:
add_headersend_responsesend_filesend_error Vérifiez l'intégralité de la documentation sur la bibliothèque SHERVER_UTILS.sh dans Scripts / Readme.md.
Tout ce qui est écrit sur la sortie standard sera envoyé au client. Voici un script très simple qui renvoie les demandes au format texte:
#! /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 "Tout autre script ou binaire
Si vous n'utilisez pas Bash, vous n'aurez accès qu'à la variable d'environnement REQUEST_FULL_STRING qui contient la demande complète en tant que chaîne. L'URL demandée ( REQUEST_URL ) sera adoptée comme premier argument.
Tout ce qui est écrit sur la sortie standard sera envoyé au client. Cependant, vous devriez écrire les en-têtes de la réponse vous-même.
Pour les scripts bash, il existe un moteur de modèle de base intégré à Sherver (LOL). Il utilise en fait envsubst pour remplacer toute occurrence de la $VARIABLE par la variable de l'environnement s'il y en a.
Vous pouvez mettre vos modèles dans les scripts / modèles du sous-dossier, bien qu'il ne soit pas obligatoire.
Voici un modèle pour un template.txt (qui améliore notre exemple de script bash précédent):
You entered the following request:
$REQUEST
Et vous l'utiliseriez avec le script suivant:
#! /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 "Exemple HTML complet dans l'exemple ci-dessous.
Les demandes de poste sont prises en charge. Vous pouvez vérifier la valeur de la variable REQUEST_METHOD qui sera soit GET ou POST , afin que vous puissiez avoir un comportement différent en fonction du type de demande.
Le contenu de la demande POST peut être repris dans la variable REQUEST_BODY . Si les données sont encodées par URL, vous pouvez utiliser la fonction parse_url avec quelques astuces pour obtenir un tableau associatif des paramètres.
Tout contenu peut être renvoyé au client. Vous pouvez ajouter le type de mime correct grâce à la méthode add_header .
Toutes les variables et fonctions mentionnées ici ont une description complète dans Scripts / Readme.md.
Tout ce qui est écrit à l'erreur standard peut être enregistré. Pour soulager les journaux, vous pouvez utiliser le log des fonctions.
Pour tenir les journaux dans un fichier, vous pouvez rediriger la sortie d'erreur de sherver.sh dans un fichier:
./sherver.sh 2> logs.txtPar défaut, les en-têtes des demandes et des réponses sont enregistrés, mais pas les corps.
Le répartiteur est responsable de demander à un fichier ou à exécuter un script, selon l'UTL demandé. Il est implémenté dans le fichier Dispatcher.sh.
Il a actuellement 4 actions:
/ ), il exécute les scripts/index.shindex.htm ou index.html , il exécute le script scripts/index.sh/file/ , il sert le fichier demandé/test/dummy.sh exécutera le script scripts/test/dummy.sh s'il existe).Tous ces comportements peuvent être modifiés en modifiant le fichier Dispatcher.sh.
Tout d'abord, vous devez créer un utilisateur spécifique qui exécutera sherver.sh avec des privilèges faibles. Nous appellerons notre utilisateur sherver et nous allons mettre l'ensemble du site Web dans son répertoire Hone.
Nous devons ajouter notre utilisateur aux groupes sudo et netdev , il est donc capable de gérer le VPN (ce n'est évidemment pas une bonne idée de donner sudo à l'utilisateur, c'est pourquoi vous ne devriez pas exposer le site Web sur Internet).
useradd -mUG sudo,netdev -s /usr/bin/bash sherver
passwd sherver
... Notez que vous pouvez ajouter votre utilisateur actuel au groupe sherver pour des raisons pratiques (vous devrez vous reloger pour le rendre efficace):
adduser USER sherverMaintenant, obtenons le site Web dans son répertoire domestique
su sherver
cd ~
git clone https://github.com/remileduc/sherver.git
cd sherver
git checkout perso Enfin, nous devons activer le service afin qu'il commence automatiquement sherver.sh . Pour ce faire, copiez le fichier sherver.service dans /usr/share/systemd/ puis activez le service:
cp sherver.service /usr/share/systemd/
ln -s /usr/share/systemd/sherver.service /etc/systemd/system/sherver.service
systemctl daemon-reload
systemctl enable sherver.serviceVous pouvez voir comme exemple les scripts que j'utilise à la maison pour gérer mon VPN. Il est accessible sur la succursale perso. Notez que vous avez besoin du script vpn-mgr.sh pour pouvoir l'utiliser correctement.
Voir Bashttpd. Il est évident de dire que cela vient sans aucune fonctionnalité de sécurité. N'exposez pas Sherver sur Internet .
Si vous devez exposer le site sur Internet, vous avez besoin d'un vrai serveur qui a été construit en particulier pour faire face à tous ces problèmes.
Cependant, il est parfait à utiliser sur un réseau local. Il sera aussi sûr que votre connexion WiFi et votre pare-feu.
Je voulais configurer rapidement un serveur qui servirait des pages dynamiques, et qui pourrait exécuter certains scripts bash, afin de contrôler mon centre multimédia via des pages Web.
Je ne voulais pas installer et configurer Apache ou Nginx. En fait, je ne voulais pas de configuration.
Sherver est capable d'exécuter sans aucune configuration. Il vous suffit d'ajouter des fichiers au bon endroit. Il peut fonctionner sans rien à installer (tous les outils utilisés font partie de l'installation par défaut de Debian, sauf peut-être pour SOCAT).
Vous pouvez voir mon cas d'utilisation dans la branche perso .
Tout est sous licence MIT.
Nous utilisons le script mimetype , expédié dans des scripts / utils / mimetype, qui est sous la licence Perl.