171 votes

Serveur web minimal utilisant netcat

J'essaie de mettre en place un serveur web minimal en utilisant netcat (nc). Lorsque le navigateur appelle localhost:1500, par exemple, il doit afficher le résultat d'une fonction ( date dans l'exemple ci-dessous, mais éventuellement ce sera un programme python ou c qui produira des données). Mon petit serveur web netcat doit être une boucle while true en bash, peut-être aussi simple que ceci :

while true ; do  echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500  ; done

Lorsque j'essaie ceci, le navigateur affiche les données actuellement disponibles au moment où nc démarre. Mais je veux que le navigateur affiche les données au moment où le navigateur les demande. Comment puis-je y parvenir ?

3voto

Vladimir Points 239
while true; do (echo -e 'HTTP/1.1 200 OK\r\nConnection: close\r\n';) | timeout 1  nc -lp 8080 ; done

Ferme la connexion après 1 seconde, pour que curl ne s'y accroche pas.

2voto

majkel Points 66

Tapez dans nc -h et voir si vous avez -e option disponible. Si oui, vous pouvez créer un script, par exemple :

script.sh

echo -e "HTTP/1.1 200 OK\n\n $(date)"

et l'exécuter comme ceci :

while true ; do nc -l -p 1500 -e script.sh; done

Notez que -e doit être activée à la compilation pour être disponible.

2voto

amerigo stevani Points 21

Je pense que le problème que toutes les solutions listées ne fonctionnent pas, est intrinsèque à la nature du service http, chaque requête établie est avec un client différent et la réponse doit être traitée dans un contexte différent, chaque requête doit forker une nouvelle instance de réponse...

La solution actuelle, selon moi, est la suivante -e de netcat mais je ne sais pas pourquoi ça ne marche pas... peut-être que c'est mon... nc version que je teste sur openwrt ...

avec socat cela fonctionne....

J'essaie ceci https://github.com/avleen/bashttpd

et cela fonctionne, mais je dois exécuter le shell script avec cette commande.

socat tcp-l:80,reuseaddr,fork EXEC:bashttpd &

El socat y netcat sur github ne fonctionne pas pour moi, mais les socat que j'ai utilisé fonctionne.

2voto

user1067920 Points 131

En fait, la meilleure façon de fermer gracieusement la connexion est d'envoyer la commande Content-Length comme suit. Le client (comme curl fermera la connexion après avoir reçu les données.

DATA="Date: $(date)"; 
LENGTH=$(echo $DATA | wc -c);
echo -e "HTTP/1.1 200 OK\nContent-Length: ${LENGTH}\n\n${DATA}" | nc -l -p 8000;

0voto

Denis Points 508

Sous OSX, vous pouvez utiliser :

while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l  localhost 1500 ; done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X