curlなしでのHTTPリクエスト:Bashの/dev/tcpについて解説

軽量化されたDockerコンテナの中にいるとします。 APIエンドポイントを確認する必要があります。 curl と入力しても「command not found」と表示されます。 wget を試しても同じエラーが出ます。

パニックになる必要はありません。 Bashのコアには、隠れた機能が組み込まれています。 それは /dev/tcp と呼ばれるものです。

この機能を使えば、ツールを一切インストールすることなく、生のTCP接続を開くことができます。 ほとんどのLinuxシステムで動作します。

仕組み: /dev/tcp/hostname/port を参照すると、Bashはソケット接続を開きます。 これはBash特有の機能です。 shzsh では動作しません。

魔法のコマンド: 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