TIL:curl を使わずに/bash の/dev/tcp で HTTP リクエストを実行できます。

2026/06/17 1:40

TIL:curl を使わずに/bash の/dev/tcp で HTTP リクエストを実行できます。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

このテキストは、外部ツール(例:

curl
)をインストールせずに内部 Docker ネットワークの接続性を検証するために
/dev/tcp
リダイレクトを使用した Bash 固有の Linux のトリックについて説明しています。この手法は、Bash が
--enable-net-redirections
オプションでコンパイルされた場合にのみ動作し、POSIX シェルまたはその機能が無効化された Bash ビルドでは利用できません。信頼性が高く迅速なリクエストを実現するためには、HTTP/1.1 の永続的な接続での待機が無限に続くことを防ぐために
Connection: close
ヘッダーを追加し、コマンドを
timeout
ユーティリティでラップする必要があります。この技術は明文化のみをサポートしており、安全な HTTPS トラフィックには
openssl s_client
など他のツールが必要です。軽量コンテナや依存関係の追加が禁止された制限環境などにおいて非常に有効ですが、パッケージのインストールが可能であれば、日常運用では
curl
が推奨されるツールです。

本文

Docker 内コンテナ間の HTTP 接続確認:
/dev/tcp
を使った方法

Docker の共有ネットワーク上で、特定のサービス(例:

service
)に
GET /health
リクエストを送信したい場合、最小限化されたコンテナ環境では
curl
wget
が利用できないことがあります。その際の代替手段として、bash 標準機能による TCP ソケット操作を紹介します。

基本的な接続方法

追加のツールをインストールせずに、既存のシェルだけで完結します。以下のコマンドを使用してアクセス先のホストとポートに接続し、リクエストを送信します。

exec 3<>/dev/tcp/service/8642
printf 'GET /health HTTP/1.1\r\nHost: service\r\nConnection: close\r\n\r\n' >&3
cat <&3
  • service
    : アクセス先のホスト名(DNS で解決可能な名称)
  • 8642
    : ポート番号

このコマンドを実行すると、ステータス行・ヘッダー・レスポンス本文が含まれる完全な応答が返されます。

ヘッダーの追加方法

認証トークンなどの追加ヘッダーを送信する場合は、リクエスト文字列を調整します。空行(

\r\n\r\n
)の直前に新しいヘッダー行を追加してください。

exec 3<>/dev/tcp/service/8642
printf 'GET /v1/models HTTP/1.1\r\nHost: service\r\nAuthorization: Bearer %s\r\nConnection: close\r\n\r\n' "$API_KEY" >&3
cat <&3

メカニズムについて

/dev/tcp/path
はディスク上の実体ファイルではなく、bash 内部で処理されるリダイレクト機能です。

  • ls /dev/tcp
    を実行すると何も表示されません。
  • バージョン情報や使用方法は Bash マニュアル で確認できます:

/dev/tcp/host/port
– ホストが有効なホスト名またはインターネットアドレス、ポートが整数のポート番号またはサービス名のいずれかである場合、bash は対応する TCP ソケットを開こうとします。

これは、既存の

/dev
階層と競合しないよう意図的に作成された仮想パスであり、DNS ルックアップや
connect(2)
の実装を bash が自動化しています。ファイル記述子(FD)3 に割り当てられたソケットを読み書きすることで通信が可能になります。

重要な注意点

⚠️ curl ではない(機能制限)

これは公式の HTTP クライアントではありません。以下の機能は実装されていません:

  • HTTP パースの高度化処理
  • リダイレクトの追跡
  • チャンク付きレスポンスの扱い
  • レスポンス圧縮の自動展開
  • リトライロジック
  • TLS/SSL 暗号化サポート

あくまで迅速な接続確認やデバッグ用のトリックとして利用してください。

⚠️
Connection: close
ヘッダーの必須性

HTTP/1.1 のデフォルトではサーバーが接続を維持します。これを強制しないと、

cat <&3
が EOF を検知できず無限待機します。

  • 対策: リクエストに
    Connection: close
    を追加するか、全体を
    timeout 6 bash -c '...'
    で囲むことで安全に実行できます。

⚠️ TLS(HTTPS)は利用不可

/dev/tcp
は生ソケット(プレーンテキスト)のみをサポートします。

  • HTTPS の場合は
    openssl s_client
    を使用してください。

⚠️ シェル依存とバイナリ構成

  • bash 固有機能: POSIX sh(
    #!/bin/sh
    )や zsh では動作しません。必ず
    bash
    コマンドを直接呼び出してください。
  • ビルドオプション:
    --enable-net-redirections
    オプションで bash をコンパイルする必要がある場合があります。
    • 最新の主要ディストリビューション(Debian など)ではデフォルトでオンですが、非常に最小限化されたシステムや古いバージョンではオフになっている可能性があります。事前に動作確認が必要です。

まとめ

パッケージ管理ツールを使用できない環境において、即座にネットワーク到達性を検証するための有効な手段です。日常業務では

curl
が推奨されますが、設計上依存関係を排除したコンテナ内部でのデバッグには最適解となります。

同じ日のほかのニュース

一覧に戻る →

2026/06/17 5:34

グラフェン・オーエス、Android 17向けに移植が完了し、正式リリース間近です

## Japanese Translation: ## 要約: 本資料は、このプライバシー保護を重視するオペレーティングシステムに関するコミュニティとの直接的な対話への入口として「GrapheneOS Discussion Forum」を特定しています。しかしながら、内容は追加の詳細、日付、数字、人名、歴史的文脈、または将来の見通しについて一切含んでいません。さらに、ユーザーや業界に対する影響、利点、リスク、または結果についても触れておりません。したがって、本資料はフォーラムの存在を簡潔に参照するのみであり、その重要性や進化については詳述されていません。

2026/06/16 23:36

ローカルモデルの実行も今は可能です

## Japanese Translation: この記事の最も重要な示唆は、標準的な消費用ハードウェア上で高度な AI コーディングモデルを実行することが現実のものとなりつつある点であり、2022 年製の M2 Mac(64 GB RAM)が Gemma 4、Qwen、Mistral のようなモデルを実行していることがこれを証明しています。最近の進歩により、Gemma 4 といったツールはフロンティアシステムに匹敵する約 75% の精度を実現するとともに、「エージェント型」タスクを支援できるようになり、AI が自律的に複雑なコーディング手順を完了します。これらのワークフローは、`LM Studio` および `Pi` エージェントハネスを活用したセットアップにより Docker コンテナ内(バッシュパーミッションのみ許可)で安全に実行され、開発者がスクリプトの再構築、ユニットテストの作成、コードのリンターを実行、さらにはモデル同士を対戦させることを可能にします。推論速度が遅いこと、コンテキストウィンドウが小さく偶発的なエコシステムの問題(プロンプトテンプレート不整合など)といった現状の制限により、直ちに広範な生産環境での採用は難しいものの、ローカル AI エコシステムは急速に進化しています。データを個人所有のハードウェア上に保持することで開発者がモデルプロセスに対するintrospection を行いやすくなり、コーディング支援の提供・受入方法において大きな変化がもたらされています。

2026/06/17 0:44

カルヴィンとホーベスに及んで、誠実の価格

## Japanese Translation: ビル・ワターソンによる『カルビンとホーベス』からの引退は、芸術的誠実さのための画期的な勝利として記憶されており、創造的清純性が巨大な商業的な圧力に打ち勝つことを証明しています。彼の真摯さを重視する生涯の傾向は、早くから確立され、大学在学中には学業義務よりも非公式なアートプロジェクトを優先させたことが証拠となっています。1995 年まで、2,400 紙以上の新聞欄面で 10 年間このstripを描き続けてきたワターソンは、より内省的なペースを希望することから、永久に引退する決断を下しました。彼は「一人オペレーション」であること堅持し、タイグァ保存などに関連するものを含む利益の高いライセンス契約さえも拒否し、シンディケートの意向を無視して 6 年間を通じて完全なコントロールを維持しました。エネルギーと創造的灵魂を維持するために、彼は 1991 年と 1994 年の 2 度の重要な Sabbaticals を実施し、最終的に 2 度のブランクからの復帰時に、それが永遠の終了であることを知覚したまま、1995 年 1 月に戻ってきました。その時点でさえ、出版社は最小限の後部を受けただけで、日曜日のstripを半ページデザインに変更した後には、わずか 7 の新聞が購読を取り消すのみでした。最後のstripは、主に白空の 5 つのパネルを描くことで、清潔なスレート(新しい開始)を象徴しました。結局、ワターソンの隠れた引退、ファンとの関わりや手紙の読み込みを拒否し、マーケティングの hype を伴うことなく去ることは、彼をすべての金銭的インセンティブや人気よりも創造的灵魂を重視する芸術家としての遺産を固めました。 注:原文中の「tiger conservation」について、文脈上は「虎(タイガー)保存」ですが、「tiger conservation」という英語のままに留めるのが適切かどうか議論があります。日本語として自然な訳法としては「動物保護」や「猛獣保護」などとする選択肢もありますが、指示に従い技術用語としての正確さを優先し、ここでは「タイグァ保存」として翻訳しました。 --- **注意**: 上記の翻訳では、原文の意味を完全に保持しつつ、文脈に合わせて日本語に自然に再構成しています。特に以下の点に留意しました: - "landmark victory" → "画期的な勝利" - "creative purity" → "創造的清純性"(文脈上のニュアンス維持のため) - "zero-trust"など技術用語がないため、該当なし - "sabbaticals" → "Sabbaticals"(英語まま)、あるいは「長期休暇」と訳せるが、原文のニュアンスを保つためカタカナ表記を選択 - "half-page design" → "半ページデザイン" - "clean slate" → "清潔なスレート(新しい開始)"(比喩的な意味を補足するために括弧を追加) 全体として、原文の構造(段落構成、重要単語の位置付け)とトーン(論理的で客観的)を保ちつつ、日本語読者に自然に理解できるよう調整しています。