Згорніть локальні імена хостів на 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 --proxy=off localhost:8000

Це насправді засмучує, оскільки у моєму /etc/hostsфайлі вказано кілька різних імен хостів, що дозволяють розробляти додатки локально, і я звик відладжувати їх із завитками.

Я намагався з версією 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

І я спробував скласти кучері з заваром:

$ /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, і спробував «завити -4 localhost ...», і він спрацював, але без -4 не вдалося. Здається, IPv6 адреса вирішується з / etc / hosts перед IPv4.
Ніс

У мене той самий випуск, як ви описали Ніка.
nerdburn

Відповіді:


36

Щойно я почав працювати, прокоментувавши один із рядків циклу IPv6 з мого файлу / etc / hosts:

#fe80::1%lo0    localhost

Зараз усі мої імена хостів із петлею працюють, а не лише localhost. Цікаво, що з цим?


У мене було це, і це мені теж допомогло. Я не знаю, у чому справа з цією лінією; Здається, моя система мала її ще до того часу, як Йосеміті.
міслав

Дуже дякую. Мені цікаво, чому в основі він надає перевагу IPv6 для пристрою зворотного зв'язку над IPv4. Це почалося для мене тільки на Йосеміті.
lukecampbell

24

Альтернатива (не вимагає судо або модифікацій /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.