用netpipes / netcat绑定端口

我正在尝试编写一个简单的bash脚本,它正在端口上侦听,并用一个简单的HTTP响应进行响应。 我的具体问题是,我不知道端口是否可用,并在绑定失败的情况下,我回落到下一个端口,直到绑定成功。

到目前为止,实现这个目标的最简单的方法是这样的:

for (( i=$PORT_BASE; i < $(($PORT_BASE+$PORT_RANGE)); i++ )) do if [ $DEBUG -eq 1 ] ; then echo trying to bind on $i fi /usr/bin/faucet $i --out --daemon echo test 2>/dev/null if [ $? -eq 0 ] ; then #success? port=$i if [ $DEBUG -eq 1 ] ; then echo "bound on port $port" fi break fi done 

在这里,我使用netpipes Ubuntu软件包中的faucet

这个问题是,如果我只是打印“testing”的输出, curl抱怨非标准的HTTP响应(错误代码18)。 这很公平,因为我不打印HTTP兼容的响应。

如果我用echo -ne "HTTP/1.0 200 OK\r\n\r\ntest"replaceecho test ,curl仍然抱怨:

 user@server:$ faucet 10020 --out --daemon echo -ne "HTTP/1.0 200 OK\r\n\r\ntest" ... user@client:$ curl ip.of.the.server:10020 curl: (56) Failure when receiving data from the peer 

我认为问题在于faucet如何打印响应和处理连接。 例如,如果我在netcat做服务器端,curl工作正常:

 user@server:$ echo -ne "HTTP/1.0 200 OK\r\n\r\ntest\r\n" | nc -l 10020 ... user@client:$ curl ip.of.the.server:10020 test user@client:$ 

我会很高兴用我的主脚本中的netcatreplacefaucet ,但问题是,我想产生独立的服务器进程,以便能够从同一个基础shell运行客户端。 faucet有一个非常方便的--daemon进程参数,因为它叉到背景,我可以使用$? (退出状态码)检查绑定是否成功。 如果我使用netcat用于类似的目的,我将不得不使用&$?分叉它$? 将无法工作。

有谁知道为什么faucet在这个特殊情况下没有正确响应和/或可以build议解决这个问题。 我没有结婚,也没有与faucetnetcat结婚,但希望使用bash或其实用程序(而不是用Perl或Python等其他脚本语言编写某些东西)来实现解决scheme。

Solutions Collecting From Web of "用netpipes / netcat绑定端口"

 faucet 10020 --out --daemon \ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: 4\r\n\r\ntest" 

工作正常。 这个问题似乎是echo不知道如何正确地shutdown一个套接字,而只是使用close ,而curl不喜欢从recvfrom得到-1(无序关闭)而不是0(有序关闭)。

小孩子干完之后,试着socat一下。

 socat tcp-l:10020,fork,reuseaddr \ exec:'echo -ne "HTTP/1.0 200 OK\r\n\r\ntest"' 

也许看看Richard Stevens的“袜子”节目。 它有:

 -F fork after connection accepted (TCP concurrent server) 

http://www.icir.org/christian/sock.html

而使用Bash你也可以使用:

 echo $'HTTP/1.0 200 OK\r\n\r\ntest\r\n' 

你真的需要使用HTTP协议,还是只是为了请卷曲? 如果是后者,简单地结合起来

  faucet $port --out --daemon echo test 

  hose $server $port --in cat 

如何使用DJB ucspi-tcp软件包中的tcpserver程序。

http://lserinol.blogspot.com/2008/12/simple-tcp-server-with-djb-tcpserver.html

netcat或nc的高级替代品是ncat(nmap的一部分)。