curl は、他の DNS オプションよりも、arg (または別のもの) を解決するために提供された IP を優先します。

curl は、他の DNS オプションよりも、arg (または別のもの) を解決するために提供された IP を優先します。

誤って構成された DNS エントリを回避するために curl を使用しようとしたとき (当時は実験的で、わかっていませんでした)、--resolve正しい方法のように思えました。しかし、引数は期待どおりに動作せず、(正常に) 404 になりました。

システムの/etc/hostsファイルを編集して適切なエントリを追加すると正常に機能するので、これは curl が DNS を解決する方法の一部であると思われます。実際、IP を無効なものに変更すると、arg や 404/etc/hostsよりも優先されます。--resolve

組み込み引数を介してシステムが提供するものよりも、名前に対して特定の IP を解決するように curl に強制することは可能ですか? (また、--resolve他の何かと組み合わせられますか?)


以下の例。犯人を保護するために名前と住所は変更されています。

% curl -L -vv --resolve "foo.example.com:80:10.14.0.1" "https://foo.example.com/path"
* Added foo.example.com:80:10.14.0.1 to DNS cache
*   Trying 10.15.0.1
* TCP_NODELAY set
* Connected to foo.example.com (10.15.0.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
 CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

答え1

答えを見つけました。--resolve正しいポートを指定する必要があります(複数のポートがある可能性があります)

さらに、*はホスト (ポートではありません!) に使用でき、これにより引数が簡素化されます。マニュアル ページでは、すべてについて非常に明確に説明されています。

% curl -L -vv --resolve "*:80:10.14.0.1" --resolve "*:443:10.14.0.1" "https://foo.example.com/path"
* Added foo.example.com:443:10.14.0.1 to DNS cache
*   Trying 10.14.0.1

関連情報