min*_*das 3 unix linux bash scripting
我正在尝试编写一个简单的 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
这里我使用的faucet是Ubuntu 的netpipes包。
问题在于,如果我只是将“test”打印到输出,curl则会抱怨非标准 HTTP 响应(错误代码 18)。这很公平,因为我不打印 HTTP 兼容的响应。
如果我替换echo test为echo -ne "HTTP/1.0 200 OK\r\n\r\ntest",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:$
我非常乐意在主脚本中替换为faucet,netcat但问题是我想生成独立的服务器进程以便能够从相同的基本 shell 运行客户端。faucet有一个非常方便的--daemon参数,因为它分叉到后台,我可以使用$?(退出状态代码)来检查绑定是否成功。如果我要用于netcat类似的目的,我将不得不使用它来分叉它&,并且$?不会工作。
有谁知道为什么faucet在这种特殊情况下不能正确响应和/或可以建议解决此问题的方法。我既没有结婚,faucet也没有结婚netcat,但希望使用 bash 或其实用程序来实现解决方案(而不是用另一种脚本语言(例如 Perl 或 Python)编写一些东西)。
faucet 10020 --out --daemon \
    echo -ne "HTTP/1.0 200 OK\r\nContent-Length: 4\r\n\r\ntest"
工作正常。问题似乎是echo不知道如何正确使用shutdown套接字,而是使用 justclose来代替,并且curl对从 获得 -1 (无序关闭)而不是 0 (有序关闭)感到不满意recvfrom。
尝试socat在孩子完成后留下来清理。
socat tcp-l:10020,fork,reuseaddr \
    exec:'echo -ne "HTTP/1.0 200 OK\r\n\r\ntest"'