Скручивайте локальные имена хостов в Mac OS X Yosemite


30

Я только что перешел с Mavericks на Yosemite и теперь curlне вижу петлевые имена хостов.

Настройте простой http-сервер для тестирования:

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

Теперь я могу поразить localhost: 8000 в Chrome. Я могу даже увидеть это. Но в curl это происходит:

$ 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.

Я пробовал с версией curl, которая поставляется с osx:

$ 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

И я попытался скомпилировать curl с 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 не удалось. Похоже, что адрес IPv6 разрешается из / etc / hosts до адреса IPv4.
Нес

У меня та же проблема, что вы описали, Ник.
nerdburn

Ответы:


36

Я просто заставил его работать, закомментировав одну из строк обратной петли IPv6 из моего файла / etc / hosts:

#fe80::1%lo0    localhost

Теперь все мои петлевые имена хостов работают, а не только localhost. Интересно, что с этим?


У меня было это, и это помогло мне также. Я не знаю, в чем дело с этой линией; Похоже, моя система имела его еще до Йосемити.
Мислав

Огромное спасибо. Интересно, хотя, почему в основе это предпочитает IPv6 для устройства обратной связи по IPv4. Это только начало происходить для меня на Йосемити.
lukecampbell

24

Альтернатива (не требует sudo или модификации /etc/hosts) - всегда используйте ipv4, пока curl не станет умнее.

$ 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решимость localhostк 127.0.0.1(предполагая , что нет других записей IPv4 для localhostв /etc/hosts).

Каждая реализация будет разрешаться localhostпо своему усмотрению, поэтому вы имели периодический успех с различными инструментами.

Чтобы быть максимально точным, используйте 127.0.0.1вместо localhost, но он привязывает вас к IPv4. localhostдает вам гибкость для работы как с протоколами IPv6, так и с протоколами IPv4, однако в некоторых реализациях у вас могут возникнуть проблемы, как в этой конкретной версии curl.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.