Właśnie zaktualizowałem system z Mavericks do Yosemite i teraz curl
nie widzę nazw hostów z pętlą zwrotną.
Skonfiguruj prosty serwer HTTP do testowania:
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Teraz mogę trafić localhost: 8000 w chrome. Mogę nawet o tym zapomnieć. Ale w curl dzieje się tak:
$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused
Działa to jednak:
$ curl 127.0.0.1:8000
Przeczytałem tę odpowiedź o ustawieniach proxy wget , ale to nie pomogło, ponieważ to działa:
$ wget --proxy=off localhost:8000
To jest naprawdę frustrujące, ponieważ mam kilka różnych nazw hostów z pętlą zwrotną wymienionych w moim /etc/hosts
pliku, dzięki czemu mogę tworzyć aplikacje lokalnie i jestem przyzwyczajony do debugowania ich za pomocą curl.
Próbowałem z wersją curl, która jest dostarczana z 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
Próbowałem kompilować curl za pomocą naparu:
$ /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
localhost
curl
hosts-file
osx-yosemite
Nick Retallack
źródło
źródło
Odpowiedzi:
Właśnie uruchomiłem to, komentując jedną z linii sprzężenia zwrotnego IPv6 z mojego pliku / etc / hosts:
Teraz działają wszystkie moje nazwy hostów z pętlą zwrotną, nie tylko localhost. Zastanawiam się, o co chodzi?
źródło
Alternatywa (nie wymaga sudo ani modyfikacji
/etc/hosts
) - zawsze używaj ipv4, aż curl stanie się bardziej inteligentny.(wtedy wszystko będzie działać zgodnie z oczekiwaniami)
źródło
Przede wszystkim
0.0.0.0
jest to specjalny adres oznaczający „dowolny adres IPv4”.Gniazdo można powiązać z protokołem IPv4 lub IPv6. Jeśli gniazdo jest powiązane
0.0.0.0
, oznacza to, że będzie nasłuchiwało dowolnego IPv4 próbującego się z nim połączyć i będzie reprezentowane w następujący sposób:*
Znak odpowiada0.0.0.0
na IPv4.W przypadku IPv6:
*
Znak odpowiada::
na IPv6, jak w oficjalnej specyfikacji .Powodem jest to, że
curl
próbuje rozwiązać losowylocalhost
wpis w/etc/hosts
, a jak wspomniano @NickRetallack, ten wpis jest wybierany przez,curl
gdy jest rozstrzyganylocalhost
w trybie domyślnym (przypuszczalnie IPv6 lub IPv4, cokolwiek rozstrzygnie się najpierw).Zmuszając go w
--ipv4
trybie, jak sugeruje @CharlesHebdough, uczynicurl
determinacjęlocalhost
do127.0.0.1
(zakładając, że nie istnieją żadne inne wpisy dla IPv4localhost
w/etc/hosts
).Każda implementacja zostanie rozwiązana
localhost
zgodnie z ich życzeniem, dlatego odniosłeś sporadyczny sukces dzięki różnym narzędziom.Aby być jak najbardziej precyzyjnym, użyj
127.0.0.1
zamiast localhost, ale będzie to wiązało cię z IPv4.localhost
daje elastyczność pracy zarówno w protokołach IPv6, jak i IPv4, jednak w niektórych implementacjach możesz mieć problemy, tak jak w tej konkretnej wersjicurl
.źródło