curlなしでのHTTPリクエスト:Bashの/dev/tcpについて解説
軽量化されたDockerコンテナの中にいるとします。
APIエンドポイントを確認する必要があります。
curl と入力しても「command not found」と表示されます。
wget を試しても同じエラーが出ます。
パニックになる必要はありません。
Bashのコアには、隠れた機能が組み込まれています。
それは /dev/tcp と呼ばれるものです。
この機能を使えば、ツールを一切インストールすることなく、生のTCP接続を開くことができます。 ほとんどのLinuxシステムで動作します。
仕組み:
/dev/tcp/hostname/port を参照すると、Bashはソケット接続を開きます。
これはBash特有の機能です。
sh や zsh では動作しません。
魔法のコマンド:
exec 3<>/dev/tcp/hostname/port
この行は双方向のファイル記述子を開きます。 これに対してデータを書き込み、レスポンスを読み取ることができます。
GETリクエストの例:
#!/bin/bash
exec 3<>/dev/tcp/example.com/80
printf "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n" >&3
cat <&3
exec 3>&-
なぜこれが便利なのか: • パッケージをインストールできない最小限の環境でのデバッグ。 • 依存関係なしでCI/CDパイプラインのヘルスチェックを実行。 • 組込みシステムでの接続テスト。 • HTTPヘッダーが正確にどのように機能するかを学ぶ。
注意すべき重要な制限事項:
• HTTPS非対応:BashはTLS/SSL暗号化を処理できません。暗号化された通信には openssl s_client を使用してください。
• リダイレクト非対応:手動で処理する必要があります。
• 複雑な用途には不向き:本番環境のHTTPクライアントとしてこれを使用しないでください。その場合は curl を使用してください。
必ず Connection: close ヘッダーを含めてください。
これを忘れると、スクリプトがサーバーからの応答を待ち続けてハングアップする可能性があります。
次回、制限の厳しいサーバーで立ち往生したときは、このテクニックを使ってみてください。 行き止まりを、使えるツールへと変えてくれます。
出典: https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852
オプションの学習コミュニティ: https://t.me/GyaanSetuAi