ポートでリッスンして、簡単な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]:$
私は私のメインのスクリプトでnetcat
でfaucet
を交換するよりも幸せだろうが、問題は、私は独立したサーバプロセスを生成したいということです同じベースシェルからクライアントを実行できるようにするためです。 faucet
は非常に便利なパラメータをバックグラウンドにフォークするので、$?
(終了ステータスコード)を使用してバインドが成功したかどうかを確認できます。同様の目的でnetcat
を使用する場合は、&
と$?
を使用してフォークする必要があります。
この特定のケースではfaucet
が正しく応答しない理由を知っている人がいるか、この問題の解決策を提案することができます。私はfaucet
とnetcat
のどちらにも結婚していませんが、ソリューションをbashやユーティリティ(PerlやPythonなどの別のスクリプト言語で記述するのではなく)を使って実装したいと考えています。
をそれは '$(())'内部を '(())を使用する必要はありません': ' for((i = PORT_BASE; i
あなたのヒントをありがとう、あなたのコメントに応じてスクリプトを変更します。 – mindas