Ich versuche, mit netcat (nc) einen minimalen Webserver einzurichten. Wenn der Browser beispielsweise localhost: 1500 aufruft, sollte er das Ergebnis einer Funktion anzeigen ( Datum im folgenden Beispiel, aber schließlich handelt es sich um ein Python- oder c-Programm, das einige Daten liefert). Mein kleiner Netcat-Webserver muss eine echte Bash-Schleife sein, möglicherweise so einfach:
while true ; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 ; done
Wenn ich dies versuche, zeigt der Browser die aktuell verfügbaren Daten in dem Moment an, in dem nc startet. Ich möchte, dass der Browser die Daten in dem Moment anzeigt, in dem der Browser sie anfordert. Wie kann ich das erreichen?
Antworten:
Versuche dies:
Die
-c
Marken NETcat den gegebenen Befehl in einer Shell ausführen, so dass Sie Echo verwenden können. Wenn Sie kein Echo benötigen, verwenden Sie-e
. Weitere Informationen hierzu finden Sie unterman nc
. Beachten Sie, dassecho
Ihr Programm (diedate
Ersetzung) bei Verwendung keine Möglichkeit hat , die Browseranforderung abzurufen. Sie möchten also wahrscheinlich endlich so etwas tun:Wo
yourprogram
muss das Protokoll erledigt werden, z. B. GET handhaben, HTTP 200 senden usw.quelle
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 zusammen mit der-l
einen Fehler ist, verwendet die offizielle Netcat-Website in ihren Beispielen beide Optionen. Siehe: nc110.sourceforge.netnc
: Hobbit (das Original), BSD / Mac OS X und GNU (das älteste der Reihe und nicht mehr gewartet). Es gibt auch Nmaps Ncat . Ich spreche das an, weil ich denke, dass es erwähnenswert ist, dass die-l
und-p
Flags zusammen nur als Fehler in der BSD- Variante von nc angesehen werden, daher die alternative Syntax von @matlehmannDonno wie oder warum, aber ich schaffe es, dies zu finden und es funktioniert für mich. Ich hatte das Problem, dass ich das Ergebnis der Ausführung einer Bash zurückgeben wollte
HINWEIS: Dieser Befehl stammt von: http://www.razvantudorica.com/08/web-server-in-one-line-of-bash
Dadurch wird ein Bash-Skript-Test ausgeführt und das Ergebnis an einen Browser-Client zurückgegeben, der eine Verbindung zum Server herstellt, auf dem dieser Befehl an Port 8080 ausgeführt wird
Mein Skript macht diesen Geldautomaten
und mein Webbrowser wird angezeigt
einfach unglaublich!
quelle
-k
Flag übergeben und nichtConnection: keep-alive
zum Anforderungsheader hinzufügen .In
-q 1
in dienetcat
Befehlszeile ein :quelle
-q
1 funktioniert nicht inCentOS
6.x, was fürCentOS
6.x verwendet werden soll, wo es heißt :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
funktionierte für mich unter Ubuntu 18.04. Hoffentlich hilft das.Das Problem, mit dem Sie konfrontiert sind, ist, dass nc nicht weiß, wann der Webclient mit seiner Anfrage fertig ist, damit er auf die Anfrage antworten kann.
Eine Websitzung sollte ungefähr so aussehen.
Zeilen, die mit "\ n" beginnen, sind einfach leere Zeilen ohne Leerzeichen und enthalten lediglich ein neues Zeilenzeichen.
Ich habe meine Bash httpd von xinetd, xinetd Tutorial gestartet . Außerdem werden Datum, Uhrzeit, Browser-IP-Adresse und die gesamte Browseranforderung in einer Protokolldatei protokolliert und die Inhaltslänge für die Server-Header-Antwort berechnet.
Um weitere Funktionen hinzuzufügen, können Sie diese integrieren.
Viel Spaß beim Bashing!
quelle
Ich hatte das gleiche Bedürfnis / Problem, aber hier hat nichts für mich funktioniert (oder ich habe nicht alles verstanden), also ist dies meine Lösung.
Ich poste meine minimal_http_server.sh (arbeite mit meiner / bin / bash (4.3.11), aber nicht mit / bin / sh wegen der Umleitung):
Und meine a_script.sh (mit Ihrem Bedarf):
quelle
read
undtr
) und einen[
Nebenfehler ( nach elif) korrigiert. Ich reproduziere dein Problem nicht. Ich verstehe nicht, warum die Datei minimal_http_server.sh diese 1-Sekunden-Intervalle verursachen würde. Sie können feststellen, ob minimal_http_server.sh oder Ihr "a_script.sh" fehlerhaft ist, indem Sie es mehrmals ausführen (mit der gleichen Geschwindigkeit wie Ihre Curl-Anforderungen) ./a_script.sh, nachdem Sie die Umgebungsvariable REQUEST festgelegt haben.Ein anderer Weg, dies zu tun
Testen wir es mit 2 HTTP-Anfragen mit Curl
In diesem Beispiel ist 172.16.2.6 die Server-IP-Adresse.
Serverseite
Client-Seite
Wenn Sie einen anderen Befehl ausführen möchten, können Sie $ (Datum) ersetzen.
quelle
quelle
read line<pipe
wird warten bisnc
wird schreibenpipe
? Aber an diesem Punkt würde ich denken, dass die Anfrage erledigt ist, bevor die Antwort geschrieben wird ..?Hier ist die Schönheit eines kleinen Bash-Webservers . Ich habe ihn online gefunden und eine Kopie gegabelt und ein wenig aufgepeppt - er verwendet
socat
odernetcat
ich habe ihn getestetsocat
- er ist in einem Skript enthalten und generiert eine eigene Konfigurationsdatei und Favicon.Standardmäßig wird es als webfähiger Dateibrowser gestartet, kann jedoch von der Konfigurationsdatei problemlos für jede Logik konfiguriert werden. Für Dateien werden Bilder und Musik (MP3s), Videos (MP4s, AVI usw.) gestreamt. Ich habe das Streaming verschiedener Dateitypen auf Linux-, Windows- und Android-Geräte getestet, einschließlich einer Smartwatch!
Ich denke, es strömt besser als VLC. Ich fand es nützlich, um Dateien auf Remote-Clients zu übertragen, die keinen Zugriff über einen Webbrowser hinaus haben, z. B. Android Smartwatch, ohne sich um die physische Verbindung mit einem USB-Anschluss kümmern zu müssen.
Wenn Sie es ausprobieren möchten, kopieren Sie es einfach und fügen Sie es in eine Datei mit dem Namen bashttpd ein. Starten Sie es dann auf dem Host mit
$> bashttpd -s
Dann können Sie zu jedem anderen Computer wechseln (vorausgesetzt, die Firewall blockiert keine eingehenden TCP-Verbindungen zu Port 8080 - dem Standardport können Sie den Port mithilfe der globalen Variablen oben im Skript nach Belieben ändern).
http://bashttpd_server_ip:8080
quelle
main
Funktion, in der es heißt[ "${REQUEST_METHOD}" = "GET" ] || fail_with 405
: github.com/AdamDanischewski/bashttpd/blob/master/bashttpdLOL, ein super lahmer Hack, aber zumindest Curl und Firefox akzeptieren ihn:
Ersetzen Sie es besser bald durch etwas Richtiges!
Ah ja, meine
nc
waren nicht genau die gleichen wie deine, die-p
Option gefiel mir nicht .quelle
Wenn Sie Apline Linux verwenden, unterscheidet sich der BusyBox-Netcat geringfügig:
quelle
Geben Sie in nc h und sehen , ob Sie haben -e verfügbare Option. Wenn ja, können Sie ein Skript erstellen, zum Beispiel:
script.sh
und führen Sie es so aus:
Beachten Sie, dass die Option -e bei der Kompilierung aktiviert sein muss, um verfügbar zu sein.
quelle
Ich denke, das Problem, dass alle aufgelisteten Lösungen nicht funktionieren, liegt in der Natur des http-Dienstes, jede eingerichtete Anfrage hat einen anderen Client und die Antwort muss in einem anderen Kontext verarbeitet werden, jede Anfrage muss eine neue geben Instanz der Antwort ...
Die aktuelle Lösung, von der ich denke, ist die
-e
von,netcat
aber ich weiß nicht, warum sie nicht funktioniert. Vielleicht ist es meinenc
Version, auf der ich testeopenwrt
...mit
socat
es funktioniert ....Ich versuche dies https://github.com/avleen/bashttpd
und es funktioniert, aber ich muss das Shell-Skript mit diesem Befehl ausführen.
Das
socat
undnetcat
Samples auf Github funktioniert bei mir nicht, aber dassocat
, was ich verwendet habe, funktioniert.quelle
reuseaddr
Flagge hast du meinen Tag gemacht! DANKEDer beste Weg, um die Verbindung ordnungsgemäß zu schließen, besteht darin, den
Content-Length
Header wie folgt zu senden . Client (wiecurl
schließt die Verbindung nach dem Empfang der Daten.quelle