我使用netcat通过bash运行一个小型开发网络服务器,它可以同时处理一个连接。
Netcat启动如下(-k
使其在多个连接中存活):
nc -kl 3000
bash脚本处理netcat收到的浏览器请求,并构建响应,该响应通过同一个netcat实例发送回浏览器。
一切都按预期工作,但有时,浏览器无法获取所请求的文件。我的怀疑:如果在完全发送响应之前关闭连接,响应的余数将作为对以下请求的响应发送(当然,它不属于)。
证明
nc -kl 3000
nc localhost 3000
hello\n
。hello\n
。world\n
。nc localhost 3000
(新连接)。world\n
,终端2也会立即显示world\n
,这意味着第一个连接中的第二个响应行。必需行为:如果不存在连接,则忽略传递给netcat的所有字节。
是否可以使用netcat? (我更喜欢像netcat这样的工具,因为它预先安装在所有机器上。)
答案 0 :(得分:3)
好吧,作为一种解决方法,如果你能做到这一点,而不是使用keep-open选项运行ncat,只需在while循环中的每个连接之间重新生成它:
while true; do
#what you want to do with: ncat -l 3000
done
然后每次重新生成进程时,它将丢弃所有stdin,然后重新开始下一个进程的下一个i / o。
当然,如果重新生成bash脚本并不方便,那么这可能意味着您没有使用正确的工具来完成工作。 (你可能能够解决使用fifos或使用临时fds的问题,但是要过度工程以避免用一种更适合这项工作的语言编写脚本。)
如果您还没有这样做,您是否尝试从netcat运行脚本而不是相反?
ncat -kl 3000 -c ./script.sh
它将为每个连接生成脚本,它将重定向stdin / stdout。然后,当客户端断开连接时,脚本将被终止并且 应该释放您的输入fd。
实际上,如果您将文件作为http服务器提供服务,则可以查找:
ncat -lk 3000 --lua-exec httpd.lua
使用httpd.lua
offered with the ncat distribution
如果你想在一个简单的任何地方运行脚本在你的系统上做某事,你可以编写一个小的python脚本。
它默认安装在ubuntu(和许多其他系统)上,并且您提供了一个简约的Web服务器实现,例如,为您提供的文件提供服务:
python -m SimpleHTTPServer <port>
http.server
它更像easy to customize,以满足您的独特需求,并为您提供对套接字和文件描述符的完全控制。
答案 1 :(得分:2)
坚持&#34;到处运行&#34;脚本,您可以尝试逐行处理输入并检测netstat是否存在ESTABLISHED连接:
while read line; do
netstat -an | grep 3000 | grep -q ESTABLISHED;
ret=$?;
if [ "$ret" == "0" ]; then
echo $line;
else
# this output is just for fun, and can be removed
echo "not sending $line" >&2;
fi;
done | nc -kl 3000
这将具有基于行的限制,如果在netstat调用之后立即关闭连接,则仍可能错误地向netcat发送数据。这两个grep调用应该确保你没有错误地检测到你自己的grep。
我已经尝试在连接关闭时查找netcat返回的信号,但是看不到任何暴露给shell的信号。
使用fifo可以用来证明netcat保持stdin打开,即使没有连接:
mkfifo test
nc -kl < test
# then in a different shell
for a in {0..5}; do echo hi > test; done
for
没有阻止,因此netcat正在主动读取stdin但缓冲它(我无法看到关闭缓冲的选项)。这意味着除了通过查看网络状态之外,您无法真正区分具有或不具有活动连接的netcat。 netstat是获得这种状态的众多方式之一。