2011-01-08 6 views
3

ポートでリッスンして、簡単なHTTP応答で応答する単純なbashスクリプトを作成しようとしています。私の具体的な問題は、ポートが使用可能かどうかわからないことです。バインドが失敗した場合、バインドが成功するまで次のポートにフォールバックします。これまでのところ、私にはnetpipes/netcatでポートにバインドする

これを達成する最も簡単な方法は、のようなものだった:私はnetpipes Ubuntuのパッケージからfaucetを使用しています。ここ

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 

この問題は、単純に出力に "test"を出力すると、curlが非標準HTTP応答(エラーコード18)に不満を表明してしまうことです。それは私がHTTP互換の応答を表示しないので十分です。

私はecho -ne "HTTP/1.0 200 OK\r\n\r\ntest"echo testを交換した場合、カールがまだ文句:

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

私は問題はfaucetが応答を印刷し、接続を処理する方法にあると思います。私はnetcatで、サーバー側を行う場合たとえば、カールが正常に動作します:

[email protected]:$ echo -ne "HTTP/1.0 200 OK\r\n\r\ntest\r\n" | nc -l 10020 
... 
[email protected]:$ curl ip.of.the.server:10020 
test 
[email protected]:$ 

私は私のメインのスクリプトでnetcatfaucetを交換するよりも幸せだろうが、問題は、私は独立したサーバプロセスを生成したいということです同じベースシェルからクライアントを実行できるようにするためです。 faucetは非常に便利な​​パラメータをバックグラウンドにフォークするので、$?(終了ステータスコード)を使用してバインドが成功したかどうかを確認できます。同様の目的でnetcatを使用する場合は、&$?を使用してフォークする必要があります。

この特定のケースではfaucetが正しく応答しない理由を知っている人がいるか、この問題の解決策を提案することができます。私はfaucetnetcatのどちらにも結婚していませんが、ソリューションをbashやユーティリティ(PerlやPythonなどの別のスクリプト言語で記述するのではなく)を使って実装したいと考えています。

+1

をそれは '$(())'内部を '(())を使用する必要はありません': ' for((i = PORT_BASE; i

+0

あなたのヒントをありがとう、あなたのコメントに応じてスクリプトを変更します。 – mindas

答えて

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

が問題ありません。問題は、ちょうどcloseを使用して、ソケットを正しく知ることができないと思われ、curlは、recvfromから0(正常シャットダウン)ではなく-1(無秩序シャットダウン)に不満です。

お子様がいなくなった後にくっついてくり返してみてください。socat

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

完璧な作業の答え、ありがとう! – mindas

1

本当にHTTPプロトコルを使用する必要がありますか、それともカールするだけですか?それは後者だ場合、単に

hose $server $port --in cat 
+0

はい、HTTPプロキシ監視を行うのが最終結果であるため、HTTPを使用する必要があります。 – mindas

1

方法DJB UCSPI-tcpのパッケージからtcpserverのと呼ばれるプログラムを使用する方法についてで

faucet $port --out --daemon echo test 

を兼ね備えています。

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

のnetcatまたはNCの高度代替それぞれNCAT(nmapの一部)です。

+0

提案をお寄せいただきありがとうございます。ただし、マニュアルページを誤読していない限り、tcpserverとncatはどちらもnetcatより優れていません。私の質問のポイントは、なぜ「蛇口」が応答しないのかを理解すること、またはプロセス状態をチェックできるように、bash(蛇口やnetcatとは違って)からフォークする必要のない代替手段を持つことです。 – mindas

2

リチャード・スティーブンスの「靴下」のプログラムもあります。それはあります

-F fork after connection accepted (TCP concurrent server) 

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

そして、あなたはまた、使用することバッシュを使用して:

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

おかげさまで、私は必要なもののように聞こえますが、蛇口のソリューションはすでに動作しています。 – mindas