Mac OS X Yosemiteでのローカルホスト名のカール


30

MavericksからYosemiteにアップグレードしたところ、curlループバックホスト名が表示されなくなりました。

テストする単純なhttpサーバーをセットアップします。

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

これで、クロームでlocalhost:8000にアクセスできます。私もそれを得ることができます。しかし、カールでは、これが起こります:

$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

ただし、これは機能します。

$ curl 127.0.0.1:8000

私はwgetプロキシ設定に関するこの回答を読みましたが、これは機能するため、助けにはなりませんでした:

$ wget --proxy=off localhost:8000

/etc/hostsファイルにいくつかの異なるループバックホスト名がリストされているため、アプリをローカルで開発でき、curlでデバッグするのに慣れているため、これは非常にイライラします。

osxに同梱されているcurlのバージョンで試しました。

$ curl --version
curl 7.37.1 (x86_64-apple-darwin14.0) libcurl/7.37.1 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz

$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

$ curl 127.0.0.1 # works

そして、私はカールをbrewでコンパイルしようとしました:

$ /usr/local/Cellar/curl/7.38.0/bin/curl --version
curl 7.38.0 (x86_64-apple-darwin14.0.0) libcurl/7.38.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz

$ /usr/local/Cellar/curl/7.38.0/bin/curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

$ /usr/local/Cellar/curl/7.38.0/bin/curl 127.0.0.1:8000 # works

node.jsアプリケーションのテストで同様の問題が発生しました。ノードのデバッグで0.0.0.0にバインドされていると表示され、「curl -4 localhost ...」を試してみましたが、動作しましたが、-4がなければ失敗しました。IPv4の前に/ etc / hostsからIPv6アドレスが解決されているようです。
ネス

ニックと同じ問題を抱えています。
オタクバーン14年

回答:


36

/ etc / hostsファイルからIPv6ループバック行の1つをコメントアウトすることで、機能するようになりました。

#fe80::1%lo0    localhost

これで、localhostだけでなく、すべてのループバックホスト名が機能するようになりました。これはどうなっているのだろうか?


私はそれを持っていて、それも私を助けました。私はそのラインとの取引が何なのかわかりません。それは私のシステムがヨセミテの前から持っていたようです。
mislav

どうもありがとうございます。しかし、なぜコアでIPv4よりもループバックデバイスにIPv6が優先されるのかと思います。これはヨセミテで私のために起こっただけです。
ルークキャンベル

24

代替案 (sudoや修正を必要としません/etc/hosts -curlが賢くなるまで常にipv4を使用します。

$ echo '--ipv4' >> ~/.curlrc

(その後、すべてが希望どおりに動作します)


おかげで—この問題は私を夢中にさせましたが、あなたの解決策は完璧に機能しました。
カイルフォックス

2

まず第一に、0.0.0.0「任意のIPv4アドレス」を意味する特別なアドレスです。

ソケットは、IPv4またはIPv6プロトコルにバインドできます。ソケットがにバインドされている場合、0.0.0.0接続しようとしているIPv4をリッスンし、次のように表されます。

$ nc -l 0.0.0.0 8085
$ lsof -i4 -Pnl | grep 8085
  nc        23994 [xxx]    3u  IPv4 [xxx]      0t0  TCP *:8085 (LISTEN)

*記号は同等です0.0.0.0 IPv4の上。

IPv6の場合:

$ nc -l :: 8085
$ lsof -i6 -Pnl | grep 8085
  nc        24145 [xxx]    3u  IPv6 [xxx]      0t0  TCP *:8085 (LISTEN)

*サインに相当し::、IPv6の上の正式な仕様のように

理由はcurl、のランダムlocalhostエントリに解決しようとするためです。/etc/hosts@ NickRetallackが述べたように、そのエントリはcurl解決時に選択されたものですlocalhostデフォルトモード(最初に解決されるものは何でもIPv6またはIPv4)で解決するます。

それを強制--ipv4@CharlesHebdoughが示唆したように、作る、モードcurl決意localhost127.0.0.1(他のIPv4エントリがために存在しないと仮定localhostでは/etc/hosts)。

各実装はlocalhost、必要に応じて解決されるため、さまざまなツールで断続的に成功しました。

可能な限り正確にする127.0.0.1には、localhostの代わりに使用しますが、IPv4にバインドされます。localhostは、IPv6プロトコルとIPv4プロトコルの両方で動作する柔軟性を提供しますが、一部の実装では、その特定のバージョンのように問題が発生する可能性がありcurlます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.