Acabo de actualizar de Mavericks a Yosemite, y ahora curl
no puedo ver los nombres de host de bucle invertido.
Configure un servidor http simple para probar:
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Ahora puedo golpear localhost: 8000 en cromo. Incluso puedo olvidarlo. Pero en curl, esto sucede:
$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused
Sin embargo, esto funciona:
$ curl 127.0.0.1:8000
Leí esta respuesta sobre la configuración del proxy wget , pero no ayudó, porque esto funciona:
$ wget --proxy=off localhost:8000
Esto es realmente frustrante, porque tengo algunos nombres de host de bucle invertido diferentes enumerados en mi /etc/hosts
archivo para poder desarrollar aplicaciones localmente, y estoy acostumbrado a depurarlos con curl.
He intentado con la versión de curl que se incluye con 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
Y he intentado compilar curl con 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
localhost
curl
hosts-file
osx-yosemite
Nick Retallack
fuente
fuente
Respuestas:
Acabo de hacerlo funcionar comentando una de las líneas de bucle invertido IPv6 de mi archivo / etc / hosts:
Ahora todos mis nombres de host de bucle invertido funcionan, no solo localhost. Me pregunto qué pasa con esto.
fuente
Alternativa (no requiere sudo o modificación
/etc/hosts
) : use siempre ipv4 hasta que curl se vuelva más inteligente.(entonces todo funcionará como se desee)
fuente
En primer lugar,
0.0.0.0
es una dirección especial que significa "cualquier dirección IPv4".Un socket puede estar vinculado al protocolo IPv4 o IPv6. Si un socket está vinculado
0.0.0.0
, eso significa que escuchará cualquier IPv4 que intente conectarse a él, y se representará de la siguiente manera:El
*
signo es equivalente a0.0.0.0
en IPv4.Para IPv6:
El
*
signo es equivalente a::
en IPv6, como en la especificación oficial .La razón es que
curl
intenta resolver unalocalhost
entrada aleatoria/etc/hosts
, y como @NickRetallack mencionó, esa entrada es la elegidacurl
cuando se resuelvelocalhost
en su modo predeterminado (supuestamente IPv6 o IPv4, lo que se resuelva primero).Forzándolo en
--ipv4
el modo, como se sugiere @CharlesHebdough, hará quecurl
la determinaciónlocalhost
de127.0.0.1
(asumiendo que no hay otras entradas IPv4 paralocalhost
en/etc/hosts
).Cada implementación se resolverá
localhost
como lo deseen, de ahí que haya tenido éxito intermitente con diferentes herramientas.Para ser lo más preciso posible, use en
127.0.0.1
lugar de localhost, pero lo vinculará a IPv4.localhost
le brinda la flexibilidad de trabajar en los protocolos IPv6 e IPv4, sin embargo, en algunas implementaciones puede tener problemas, como en esa versión específica decurl
.fuente