Bashシェルsciptは、複数のコマンドラインツール(、、、、wget
)を使用してhttpサーバーをテストします。curl
httpie
たとえば、カールを使用してGET要求を呼び出すと、http通信が完了するとすぐにサーバーへのTCP接続が開いて閉じられることがわかります。
$ curl http://10.5.1.1/favicon.ico -o /dev/null
サーバーの接続維持動作をよりよくテストするために、複数のhttp要求/応答サイクルにわたってTCP接続を開いたままにしたいと思います。
次のように、bashで直接誤ったhttp要求を実行できます。
exec 3<>/dev/tcp/10.5.1.1/80
printf "GET /\r\n\r\n" >&3
while IFS= read -r -u3 -t2 line || [[ -n "$line" ]]; do echo "$line"; done
exec 3>&-
exec 3<&-
しかし、私のテスト通信は(認証などを含む)はるかに複雑なので、bashや他のスクリプト言語で直接コーディングするのではなく、既存のツールを使用したいと思います。アイデアは、まずbashでtcpソケットを開いてから、いくつかのコマンドラインツールが独自のソケットを開くのではなく、この接続を使用するようにすることです。たぶんこんなものかもしれません。
exec 3<>/dev/tcp/10.5.1.1/80
curl http://10.5.1.1/message.txt --use-existing-socket-fd=3
# ... do some other testing stuff ...
wget http://10.5.1.1/message.txt --use-existing-socket-fd=3
# ... do some other testing stuff ...
http http://10.5.1.1/message.txt --use-existing-socket-fd=3
exec 3>&-
exec 3<&-
上記のツールや他のツールを使用してこれは可能ですか?
ベストアンサー1
あなたが探しているツールはですsocat
。 Webサーバーをテストしているので、そのサーバーへの永続接続を確立するように要求できます(Webサーバーを閉じるように選択しない限り、それに応じてタイムアウトを調整してください)。完了すると、接続をトンネルとして使用できます。これを行うには2つの方法があります。
Unixソケットによるクエリ
curl
--unix-socket
Unixソケットを介してHTTPリクエストを送信し、HTTPレスポンスを受信するオプションがあります。 (あなたのコメントありがとうございます。)
次のように使用できます。
socat TCP:10.5.1.1:80 UNIX-LISTEN:/tmp/curl.sock,fork
その後、他の端末で次のことを行います。
curl --unix-socket /tmp/curl.sock http://10.5.1.1/message1.txt
curl --unix-socket /tmp/curl.sock http://10.5.1.1/message2.txt
...
疑似HTTPプロキシによるクエリ
トンネルを擬似プロキシとして使用して、、...を接続することもできwget
ますcurl
。このソリューションの利点はこれに限定されませんcurl
。
今回はsocat
ローカルTCPポート(3128など)でリッスンします。
socat TCP:10.5.1.1:80 TCP-LISTEN:3128,fork,reuseaddr
その後、他の端末で次のことを行います。
export http_proxy='http://localhost:3128'
curl http://10.5.1.1/message.txt
wget http://10.5.1.1/message.txt
....
HTTP クライアントはプロキシを使用するため、HTTP 要求が若干変更され、望ましくない可能性があります。
もちろん、両方のソリューションは複数のHTTPサーバーで動作しません。これは、すべての要求を受信するチャネルの末尾にあるWebサーバーであるためです。