Bash の /dev/TCP で curl なしで HTTP リクエスト送信可能
原題: TIL: You can make HTTP requests without curl using Bash /dev/TCP
なぜ重要か
最小限コンテナ環境での運用時に標準ツールだけでネットワーク疎通確認が可能になり、依存関係を増やさない設計思想に合致する。組み込みシステムやセキュリティ重視環境での実装選択肢が拡がる。
開発者 Marek Šuppa 氏が、curl や wget がないミニマルなコンテナ環境で Bash の /dev/TCP 機能を使い HTTP リクエストを送信する方法を紹介。exec と printf、cat コマンドを組み合わせることで、TCP ソケットを直接操作し HTTP/1.1 リクエストを実行できると説明している。
Šuppa 氏は Docker ネットワーク上のコンテナ間通信確認時に、curl を使えない環境に直面した。その解決策として Bash の内部リダイレクト機能 /dev/tcp を活用する手法を発見した。
実装方法は単純で、exec 3<>/dev/tcp/host/port で TCP ソケットにファイルディスクリプタ 3 を割り当て、printf で HTTP リクエストを構築して出力し、cat で応答を読み取る。例として GET /health リクエストの場合、Host ヘッダと Connection: close を含める必要があると指摘。Connection: close がないと HTTP/1.1 のデフォルト動作でサーバが接続を保持し続け、cat が無限に待機するため重要だと述べている。
同氏は重要な制限事項も列挙。/dev/TCP はリダイレクト機能であり実ファイルではなく Bash が内部処理する。リダイレクト、圧縮、TLS など curl が提供する機能には非対応で、TLS が必要な場合は openssl s_client が必要だと説明。また POSIX 標準ではなく Bash 固有機能で、dash や zsh では利用不可。さらに --enable-net-redirections でコンパイルされた Bash が必要で、古いシステムでは無効な場合があるとも警告している。
šuppa 氏は通常業務では curl の使用を推奨しながらも、インストール制限のあるミニマルコンテナでの簡易確認には実用的だと結論づけている。