J'essaye de mettre en place un serveur Web minimal en utilisant netcat (nc). Lorsque le navigateur appelle localhost: 1500, par exemple, il devrait afficher le résultat d'une fonction ( date dans l'exemple ci-dessous, mais ce sera finalement un programme python ou c qui produira des données). Mon petit serveur Web netcat doit être une boucle while true dans 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'essaye cela, le navigateur affiche les données actuellement disponibles au moment où nc démarre. Je veux que le navigateur affiche les données au moment où le navigateur le demande, cependant. Comment puis-je atteindre cet objectif?
Réponses:
Essaye ça:
Le
-c
fait que netcat exécute la commande donnée dans un shell, vous pouvez donc utiliser echo. Si vous n'avez pas besoin d'écho, utilisez-e
. Pour plus d'informations à ce sujet, essayezman nc
. Notez que lors de l'utilisation,echo
il n'y a aucun moyen pour votre programme (ledate
remplacement) d'obtenir la requête du navigateur. Donc, vous voulez probablement enfin faire quelque chose comme ceci:Où
yourprogram
faut-il faire les choses de protocole comme gérer GET, envoyer HTTP 200, etc.la source
while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l localhost 1500; done
It is an error to use this option in conjunction with the -l option
-p
option avec celle--l
ci est une erreur, le site Web officiel de netcat utilise les deux options dans ses exemples. Voir: nc110.sourceforge.netnc
: Hobbit (l'original), BSD / Mac OS X et GNU (le plus ancien du groupe, et n'est plus maintenu). Il y a aussi Ncat de Nmap . J'évoque cela parce que je pense qu'il vaut la peine de noter que les indicateurs-l
et-p
ensemble ne sont considérés comme une erreur que dans la saveur BSD de nc, d'où la syntaxe alternative donnée par @matlehmannDonno comment ou pourquoi mais j'arrive à trouver ça autour et ça marche pour moi, j'ai eu le problème que je voulais retourner le résultat de l'exécution d'un bash
REMARQUE: Cette commande est tirée de: http://www.razvantudorica.com/08/web-server-in-one-line-of-bash
cela exécute le test de script bash et renvoie le résultat à un navigateur client se connectant au serveur exécutant cette commande sur le port 8080
Mon script fait ce guichet automatique
et mon navigateur Web affiche
simplement extraordinaire!
la source
-k
indicateur, pas en l'ajoutantConnection: keep-alive
à l'en-tête de la demande.Ajoutez
-q 1
à lanetcat
ligne de commande:la source
-q
1 ne fonctionne pas dansCentOS
6.x ce qui devrait être utilisé pourCentOS
6.x où il dit:nc: invalid option -- 'q'
.while true; do tail -f /usr/local/freeswitch/log/freeswitch.log | nc -l 9999; done &
/usr/local/freeswitch/log/freeswitch.log
?-q 1
fonctionné pour moi sur Ubuntu 18.04. J'espère que cela pourra aider.Le problème auquel vous êtes confronté est que nc ne sait pas quand le client Web en a terminé avec sa demande pour pouvoir y répondre.
Une session Web devrait ressembler à quelque chose comme ça.
Les lignes qui commencent par "\ n" sont simplement des lignes vides sans même espace et ne contiennent rien de plus qu'un caractère de nouvelle ligne.
J'ai mon bash httpd lancé par xinetd, tutoriel xinetd . Il enregistre également la date, l'heure, l'adresse IP du navigateur et l'ensemble de la demande du navigateur dans un fichier journal, et calcule Content-Length pour la réponse d'en-tête du serveur.
Pour ajouter plus de fonctionnalités, vous pouvez intégrer.
Bon coup!
la source
J'avais le même besoin / problème mais rien ici n'a fonctionné pour moi (ou je n'ai pas tout compris), c'est donc ma solution.
Je poste mon minimal_http_server.sh (travaillant avec mon / bin / bash (4.3.11) mais pas / bin / sh à cause de la redirection):
Et mon a_script.sh (avec votre besoin):
la source
read
ettr
) et un mineur ([
suivant elif). Je ne reproduis pas votre problème. Je ne vois pas pourquoi le minimal_http_server.sh provoquerait ces intervalles de 1 seconde. Vous pouvez déterminer si c'est minimal_http_server.sh ou votre "a_script.sh" qui est défectueux en exécutant plusieurs fois (au même rythme que vos requêtes curl) ./a_script.sh après avoir défini la variable d'environnement REQUEST.Une autre façon de faire cela
Testons-le avec 2 requêtes HTTP utilisant curl
Dans cet exemple, 172.16.2.6 est l'adresse IP du serveur.
Du côté serveur
Côté client
Si vous souhaitez exécuter une autre commande, n'hésitez pas à remplacer $ (date).
la source
la source
read line<pipe
attendra quenc
écrire danspipe
? Mais à ce stade, je pense que la demande est faite avant que la réponse ne soit écrite ..?Voici une beauté d' un petit serveur Web bash , je l'ai trouvé en ligne et ai fourché une copie et je l'ai un peu amélioré - il l'utilise
socat
ounetcat
je l'ai testé avecsocat
- il est autonome dans un script et génère son propre fichier de configuration et favicon.Par défaut, il démarrera en tant que navigateur de fichiers compatible Web tout en étant facilement configuré par le fichier de configuration pour toute logique. Pour les fichiers, il diffuse des images et de la musique (mp3), des vidéos (mp4, avi, etc.) - J'ai testé différents types de fichiers en streaming sur des appareils Linux, Windows et Android, y compris une smartwatch!
Je pense que cela diffuse mieux que VLC en fait. Je l'ai trouvé utile pour transférer des fichiers vers des clients distants qui n'ont pas d'accès au-delà d'un navigateur Web, par exemple une smartwatch Android, sans avoir à se soucier de la connexion physique à un port USB.
Si vous voulez l'essayer, copiez-le et collez-le dans un fichier nommé bashttpd, puis démarrez-le sur l'hôte avec
$> bashttpd -s
Ensuite, vous pouvez aller sur n'importe quel autre ordinateur (en supposant que le pare-feu ne bloque pas les connexions TCP entrantes vers le port 8080 - le port par défaut, vous pouvez changer le port en ce que vous voulez en utilisant les variables globales en haut du script).
http://bashttpd_server_ip:8080
la source
main
fonction où il est dit[ "${REQUEST_METHOD}" = "GET" ] || fail_with 405
: github.com/AdamDanischewski/bashttpd/blob/master/bashttpdLOL, un hack super boiteux, mais au moins curl et firefox l'accepte:
Vous feriez mieux de le remplacer bientôt par quelque chose de convenable!
Ah oui, les miens
nc
n'étaient pas exactement les mêmes que les vôtres, il n'aimait pas l'-p
option.la source
Si vous utilisez Apline Linux, le netcat BusyBox est légèrement différent:
la source
Tapez nc -h et voyez si vous avez l' option -e disponible. Si oui, vous pouvez créer un script, par exemple:
script.sh
et exécutez-le comme ceci:
Notez que l' option -e doit être activée lors de la compilation pour être disponible.
la source
Je pense que le problème que toute la solution répertoriée ne fonctionne pas, est intrinsèque à la nature du service http, chaque demande établie est avec un client différent et la réponse doit être traitée dans un contexte différent, chaque demande doit créer un nouveau instance de réponse ...
La solution actuelle que je pense est la
-e
denetcat
mais je ne sais pas pourquoi ne fonctionne pas ... c'est peut-être manc
version sur laquelle je testeopenwrt
...avec
socat
ça marche ...J'essaye ceci https://github.com/avleen/bashttpd
et cela fonctionne, mais je dois exécuter le script shell avec cette commande.
Les échantillons
socat
etnetcat
sur github ne fonctionnent pas pour moi, mais ceuxsocat
que j'ai utilisés fonctionnent.la source
reuseaddr
drapeau tu as fait ma journée! MERCIEn fait, la meilleure façon de fermer correctement la connexion est d'envoyer l'en-
Content-Length
tête comme suit. Client (commecurl
fermera la connexion après avoir reçu les données.la source