2016-10-17 67 views
7

Próbuję skonfigurować serwer WWW przy użyciu tylko skryptów wsadowych systemu Windows.Jak reagować warunkowo na podstawie żądania przy użyciu netcat

mam już wymyślić następujący scenariusz:

@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 
) 
) 

Jednak odpowiedź jest zawsze jedna prośba tyłu, to znaczy, jeśli mam wpisać coś takiego w przeglądarce:

REQUEST: localhost/mystring 

będę się następującą odpowiedź:

RESPONSE: not-found 

Dopiero w następnym żądaniu otrzymam corr ect odpowiedź na żądanie przedstawione powyżej.

Tak się dzieje, ponieważ natychmiast po otrzymaniu żądania netcat odpowiada na bieżącą zawartość pliku tempfile.txt, który nie został jeszcze zaktualizowany na podstawie żądania.

Czy istnieje sposób blokowania odpowiedzi, dopóki plik tempfile.txt nie zostanie zaktualizowany, ani żadna inna metoda, która osiągnie oczekiwany wynik?

+1

Ty nadpisanie zawartości 'pliku tymczasowego .txt' z ciągiem "found" lub "not-found"; Twój kod nie powinien działać w ogóle. – SomethingDark

+0

@SomethingDark Uważam, że był celowy. Nie są to logi. Mają zawierać zawartość HTTP. OP pyta się, w jaki sposób ustawić warunkowe wyjście 'nc' na podstawie zawartości nagłówka żądania przeglądarki. – rojo

+0

@rojo - nadpisuje plik, który wysyła do netcata. Netcat powinien wymiotować błędy w lewo i prawo. – SomethingDark

Odpowiedz

3

Problem polega na tym, że o ile mogę stwierdzić, nc nie może wykonać wywołania zwrotnego w celu dopasowania jego wyjścia w oparciu o dane wejściowe klienta. Gdy masz ...

stdout generation | nc -l 

... blokowanie i oczekiwanie na połączenie, jego produkcja jest już ustalona. Ten wynik jest statyczny w tym punkcie.

Jedyne obejście, które występuje, jest raczej mało skuteczne. To w zasadzie obejmuje następującą logiką:

  1. nasłuchiwać połączenia przygotowanego aby klient wykonać przeładowanie
  2. zeskrobać adres uzyskać z nagłówkami poprzedniego życzenie użytkownika.
  3. Podawać odpowiednich treści na drugie połączenie klienta

Przykładowy kod:

@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 
) 

Na marginesie, opóźniony rozbudowa może okaleczyć wartości zmiennych ustalonych z wykrzyknikami, jeśli jest włączona w momencie ustawienia. Najlepiej poczekać, aby włączyć opóźnione rozwinięcie do pobrania.

Ponadto podczas wykonywania sprawdzania logicznego na %ERRORLEVEL% bardziej wdzięczne jest stosowanie conditional execution. Ale to nie ma nic wspólnego z moim rozwiązaniem. :)

I wreszcie, zamiast robić type filename.html | nc -l, należy rozważyć użycie <filename.html nc -l (lub nc -l <filename.html), aby uniknąć niepotrzebnego wykorzystywania type.

+0

podchwytliwe rozwiązanie, ale dostarcza to, co było wymagane, ty;) – utxeee

5

Zamówienie opcję -e, można napisać skrypt, który wykonuje przetwarzanie, a następnie wykonać

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

które stdin i stdout rura iz powrotem z NC do skryptu jak chcesz.

exec.bat może być coś podobnego (kod nieco pseudo):

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

a może pętli (także nieco pseudo kod):

: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

Czy możesz podać jakiś działający kod jako dowód koncepcji? Jeśli tak, to jakiej wersji netcat użyłeś, z którym pracuje twój kod? Próbowałem każdej permutacji, którą mogę wymyślić używając [netcat 1.12 dla Win32/64] (https://eternallybored.org/misc/netcat/), i bez ani x86, ani wersji x64 nie mogę uzyskać '-e 'przełącz, aby uruchomić skrypt wsadowy i wysłać jego dane wyjściowe do klienta. Firebug zawsze pokazuje status żądania GET jako "Aborted". – rojo

+0

tak na linuxie, ale skontaktuję się z Tobą za około 4 i pół godziny. – nephi12

+0

ha sprawiają, że 6 i pół. robić to teraz. – nephi12