"netcat -e" 执行脚本后重置连接

"netcat -e" resetting connection after executing script

我发现了一个类似的问题here但是没有答案。

我写了这个名为 answer.sh:

的脚本
#!/bin/sh

echo "HTTP/1.1 200 OK

Hello World"

如果我运行

./answer.sh | nc -c -l -p 8797

然后浏览到 localhost:8797 我得到一个只有 "Hello World" 文本的网页(这正是我想要的)。

但是如果我 运行

nc -l -p 8797 -e ./answer.sh

浏览器提示连接中断。 所以我试试

nc localhost 8797

看看会发生什么,我明白了:

HTTP/1.1 200 OK

Hello World
read(net): Connection reset by peer

我想了解正在发生的事情以及工作方式与其他工作方式之间(技术上)的区别。

提前致谢。

这个问题的答案似乎进展缓慢。我无法用 nc -e 进行测试,所以这不是完整的答案,但也许它会有助于开始对话...

我建议在 HTTP 响应中使用 Content-Length: header,例如

#!/bin/sh

echo "HTTP/1.1 200 OK
Content-Length: 11

Hello World"

用于...

./answer.sh | nc -l -p 8797

...我发现它允许普通浏览器完成请求。没有它浏览器不知道什么时候停止读取响应,并会等待服务器端关闭连接。

当作为客户端从 nc localhost 8797 连接时,显然这没有区别。 nc 对 HTTP header 不感兴趣,只会继续阅读,直到服务器端断开连接。