2016-10-17 7 views
7

Я пытаюсь настроить веб-сервер, используя только пакетные скрипты Windows.Как отвечать условно на основе запроса при использовании netcat

Я уже придумал следующий сценарий:

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

Однако ответ всегда один запрос позади, я имею в виду, если я типа что-то вроде этого в браузере:

REQUEST: localhost/mystring 

я получаю следующий ответ:

RESPONSE: not-found 

только в следующем запросе я буду получать корбанк ect для запроса, представленного выше.

Это происходит потому, что как только netcat получает запрос, он отвечает текущим содержимым файла tempfile.txt, который еще не обновлен на основе запроса.

Есть ли способ заблокировать ответ до обновления tempfile.txt или любого другого метода, который достигнет ожидаемого результата?

+1

Вы перезаписать содержимое 'TempFile .txt' с строкой «найден» или «не найден»; ваш код не должен работать вообще. – SomethingDark

+0

@SomethingDark Я считаю, что это было намеренно. Они не предназначены для ведения журналов. Они предназначены для содержания HTTP-контента. То, что задает OP, - это как сделать вывод вывода «nc» TCP на основе содержимого заголовка запроса браузера. – rojo

+0

@rojo - он переписывает файл, который он передает в netcat. У Netcat должны быть проблемы с рвотой влево и вправо. – SomethingDark

ответ

3

Проблема, насколько я могу судить, nc не может выполнить обратный вызов, чтобы настроить свой вывод на основе ввода клиента. После того как вы ...

stdout generation | nc -l 

... блокировка и ожидание соединения, выход которого уже определен. Этот вывод является статическим в этой точке.

Единственное обходное решение, которое происходит со мной, довольно неэффективно. Это в основном включает в себя следующую логику:

  1. Listen для соединения, полученного, чтобы клиент выполнить перезагрузку
  2. скрести адрес GET из заголовков предыдущего запроса.
  3. Подавать соответствующее содержание на втором соединении клиента

Пример код:

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

Как примечание стороны, задержка расширение может изуродовать значения переменных, установленные с восклицательными знаками, если он включен в то время, настройки. Лучше ждать, чтобы включить замедленное расширение до извлечения.

Кроме того, при выполнении булевой проверки на %ERRORLEVEL% более грациозно использовать conditional execution. Но это не имеет никакого отношения к моему решению. :)

И, наконец, вместо того, чтобы делать type filename.html | nc -l, рассмотреть вопрос об использовании <filename.html nc -l (или nc -l <filename.html), чтобы избежать бесполезного использования type.

+0

сложное решение, но доставляет то, что было запрошено, ty;) – utxeee

5

заказ вариант -e, вы можете написать скрипт, который делает обработку, а затем выполнить

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

который бы труба STDIN и STDOUT назад и вперед от нк к сценарию, как вы хотите.

exec.bat может быть что-то вроде (несколько псевдо-код):

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

или возможно петлевой (также несколько псевдо-код):

: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

Можете ли вы предоставить какой-либо рабочий код в качестве доказательства концепции? Если да, то какой сборник netcat вы использовали, с которым работает ваш код? Я пробовал каждую перестановку, которую я могу придумать, используя [netcat 1.12 для Win32/64] (https://eternallybored.org/misc/netcat/), и ни с x86, ни с x64-сборкой я не могу получить '-e 'переключиться на запуск пакетного скрипта и отправить его результат клиенту. Firebug всегда показывает статус запроса GET как «Отменен». – rojo

+0

да им на вершине linux, но вернемся к вам примерно через 4 с половиной часа. – nephi12

+0

ha сделать это 6 с половиной. делая это сейчас. – nephi12