如何在使用netcat时根据请求有条件地做出响应

我正在尝试仅使用Windows批处理脚本来设置Web服务器。

我已经想出了以下脚本:

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

但是,响应总是一个请求,我的意思是,如果我在浏览器中input这样的内容:

 REQUEST: localhost/mystring 

我会得到以下回应:

 RESPONSE: not-found 

只有在下一个请求中,我才会收到上面提出的请求的正确答案。

发生这种情况是因为一旦netcat接收到一个请求,它会根据请求响应当前尚未更新的tempfile.txt内容。

是否有任何方法来阻止响应,直到tempfile.txt更新或任何其他方法完成预期的结果?

Solutions Collecting From Web of "如何在使用netcat时根据请求有条件地做出响应"

问题是,就我所知, nc不能执行回调来根据客户端输入来定制其输出。 一旦你有…

 stdout generation | nc -l 

…阻塞并等待连接,其输出已经确定。 那个时候的输出是静态的。

我遇到的唯一解决方法是效率低下。 它基本上涉及以下逻辑:

  1. 听取准备使客户端执行重新加载的连接
  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%上执行布尔检查时,使用条件执行更为优雅。 但这与我的解决方案无关。 🙂

最后,而不是type filename.html | nc -l type filename.html | nc -l ,考虑使用<filename.html nc -l (或nc -l <filename.html )来避免无用的type使用。

检出-e选项,你可以编写一个脚本来处理,然后执行

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

这将管道标准输入和标准输出来回nc到脚本就像你想要的。

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)