2016-10-17 1 views
7

Ich versuche, einen Web-Server mit nur Windows-Batch-Scripting einzurichten.Wie reagiere ich bedingungsabhängig basierend auf der Anfrage bei der Verwendung von Netcat

Ich habe bereits mit dem folgenden Skript kommen:

@echo off 
@setlocal enabledelayedexpansion 

for /l %%a in (1,0,2) do (
    type tempfile.txt | nc -w 1 -l -p 80 | findstr mystring 
    if !ERRORLEVEL! == 0 (
    echo found > tempfile.txt 
) else (
    echo not-found > tempfile.txt 
) 
) 

Doch die Antwort ist immer eine Anforderung zurück, ich meine, wenn ich so etwas wie dies in den Browser eingeben:

REQUEST: localhost/mystring 

ich werde die folgende Antwort erhalten:

RESPONSE: not-found 

in Nur der nächsten Anforderung werde ich die korr erhalten ect Antwort für die oben dargestellte Anfrage.

Dies geschieht, weil Netcat eine Anfrage erhält, antwortet es mit dem aktuellen Inhalt der Datei tempfile.txt, die aufgrund der Anfrage noch nicht aktualisiert wurde.

Gibt es eine Möglichkeit, die Antwort zu blockieren, bis die tempfile.txt aktualisiert wird oder eine andere Methode, die das erwartete Ergebnis erzielt?

+1

Sie überschreiben den Inhalt von 'tempfile .txt' entweder mit der Zeichenfolge "gefunden" oder "nicht gefunden"; Ihr Code sollte überhaupt nicht funktionieren. – SomethingDark

+0

@SomethingDark Ich glaube, das war beabsichtigt. Diese sind nicht als Protokolle gedacht. Sie sollen HTTP-Inhalt enthalten. Was OP fragt, ist, wie man die 'nc'-TCP-Ausgabe basierend auf dem Inhalt des Anfrage-Headers des Browsers bedingt. – rojo

+0

@rojo - Er überschreibt eine Datei, die er an netcat anbindet. Netcat sollte links und rechts Erbrechen Fehler geben. – SomethingDark

Antwort

3

Das Problem ist, soweit ich das beurteilen kann, nc kann keinen Rückruf durchführen, um seine Ausgabe basierend auf Client-Eingabe anzupassen. Sobald Sie haben ...

stdout generation | nc -l 

... blockiert und wartet auf eine Verbindung, wird dessen Ausgang bereits bestimmt. Dieser Ausgang ist an diesem Punkt statisch.

Die einzige Problemumgehung, die mir vorkommt, ist ziemlich ineffizient. Es umfasst im Wesentlichen die folgende Logik:

  1. für eine Verbindung Hören vorbereitet der Client einen Reload
  2. Scrape die GET-Adresse aus dem vorherigen Antrag der Header zu machen zuführen.
  3. Serve relevante Inhalte auf der zweiten Verbindung des Clients

Beispielcode:

@echo off & setlocal 

rem // macro for netcat command line and args 
set "nc=\cygwin64\bin\nc.exe -w 1 -l 80" 

rem // macro for sending refresh header 
set "refresh=^(echo HTTP/1.1 200 OK^&echo Refresh:0;^)^| %nc%" 

for /L %%# in (1,0,2) do (
    rem // run refresh macro and capture client's requested URL 
    for /f "tokens=2" %%I in ('%refresh% ^| findstr "^GET"') do set "URL=%%I" 

    rem // serve content to the client 
    setlocal enabledelayedexpansion 
    echo URL: !URL! | %nc% 
    endlocal 
) 

Als Randnotiz kann verzögert Expansion Variablenwerte mit Ausrufezeichen gesetzt verstümmeln, wenn es an der Zeit aktiviert ist der Einstellung. Am besten wartet man, um die verzögerte Erweiterung bis zum Abruf zu aktivieren.

Auch bei der Durchführung einer booleschen Überprüfung auf %ERRORLEVEL% ist es graziöser, conditional execution zu verwenden. Aber das hat nichts mit meiner Lösung zu tun. :)

Und schließlich statt type filename.html | nc -l zu tun, betrachtet <filename.html nc -l (oder nc -l <filename.html) mit dem nutzlosen Einsatz von type zu vermeiden.

+0

tricky Lösung, aber liefert, was angefordert wurde, ty;) – utxeee

5

Kasse die -e Option, könnten Sie ein Skript schreiben, das die Verarbeitung tut und dann

nc -L -w1 -p 80 -eexec.bat 

auszuführen, das Rohr stdin und stdout zurück wären und her von nc, um das Skript wie Sie wollen.

exec.bat könnte so etwas wie (etwas Pseudo-Code) sein:

findstr mystring 
if not errorlevel 1 (echo found) else (echo not-found) 

oder vielleicht eine Schleife (auch etwas Pseudo-Code):

:top 
set /p input= 
if input wasn't "" echo %input% >> output.dat && goto top 
findstr /C:"mystring" output.dat 
if not errorlevel 1 (echo found) else (echo not-found) 
+0

Können Sie einen funktionierenden Code als Proof of Concept? Wenn ja, mit welchem ​​Build von netcat haben Sie gearbeitet, mit dem Ihr Code arbeitet? Ich habe jede Permutation ausprobiert, die ich mit [netcat 1.12 für Win32/64] (https://eternedbored.org/misc/netcat/) anfangen kann, und weder mit dem x86 noch mit dem x64-Build könnte ich das -e bekommen 'wechseln, um ein Batch-Skript auszuführen und seine Ausgabe an den Client zu senden. Firebug zeigt immer den GET-Anforderungsstatus als "Abgebrochen" an. – rojo

+0

yeah ich bin auf einem Linux-Top, werde aber in etwa 4 ½ Stunden zu Ihnen zurückkommen. – nephi12

+0

ha machen, dass 6 und eine Hälfte. mach es jetzt. – nephi12

Verwandte Themen