既存のTCP接続を使用してbashスクリプトからhttpサーバーにアクセスする方法は?

既存のTCP接続を使用してbashスクリプトからhttpサーバーにアクセスする方法は?

Bashシェルsciptは、複数のコマンドラインツール(、、、、wget)を使用してhttpサーバーをテストします。curlhttpie

たとえば、カールを使用して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-socketUnixソケットを介して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サーバーであるためです。

おすすめ記事