curlを使わずにHTTPリクエストを送信する
curlやwgetが利用できないサーバーで作業することもあるかもしれません。エンドポイントをテストする必要があるのに、それらのツールが見当たらないといった状況です。そのような場合、Bashを使用して直接HTTPリクエストを送信することができます。
Bashには /dev/tcp と呼ばれる隠れた機能があります。これは実際のファイルではなく、Bashが理解できる特殊なデバイスです。/dev/tcp/hostname/port に書き込むと、Bashが代わりにTCP接続を確立してくれます。
仕組み:
exec コマンドを使用してファイル記述子(file descriptor)を管理します。例えば、読み書き用にファイル記述子 3 を開くことができます。
構文は以下の通りです:
exec 3<>/dev/tcp/example.com/80
この接続が開かれると、データを送信したり、逆にデータを読み取ったりできるようになります。この手法を用いることで、HTTPプロトコルが低レイヤーでどのように動作しているのかを理解できます。
GETリクエストを送信する方法:
データを取得するには、正しいヘッダーを送信する必要があります。また、リクエストの終了を知らせるために、最後に空行を入れる必要があります。
以下の手順に従ってください:
- ホスト、ポート、パスの変数を設定します。
execを使用して接続を開きます。printfを使用してGETリクエストを送信します。改行には\r\nを使用してください。catまたはループを使用してレスポンスを読み取ります。- 完了したらファイル記述子を閉じます。
Example script:
HOST="example.com"
PORT=80
REQUEST_PATH="/"
exec 3<>/dev/tcp/${HOST}/${PORT}
printf "GET ${REQUEST_PATH} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
cat <&3
exec 3>&-
このテクニックは、クライアントとサーバーがどのように通信しているかを理解するのに役立ちます。最小限の構成のシステムでデバッグを行う際に非常に有用なスキルです。