Mac OS X Yosemite에서 로컬 호스트 이름 컬


30

방금 매버릭스에서 요세미티로 업그레이드했으며 이제 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 settings에 대한이 답변을 읽었 지만 도움이되지 않았습니다.

$ 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

그리고 나는 브루로 컬을 컴파일하려고 시도했습니다.

$ /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 주소보다 먼저 IPv6 주소가 / etc / hosts에서 분석되고있는 것 같습니다.
Neth

Nick과 같은 문제가 있습니다.
nerdburn

답변:


36

내 / etc / hosts 파일에서 IPv6 루프백 라인 중 하나를 주석 처리하여 작동하도록했습니다.

#fe80::1%lo0    localhost

이제 로컬 호스트뿐만 아니라 모든 루프백 호스트 이름이 작동합니다. 무슨 일인지 궁금 하신가요?


나는 그것을 가지고 있었고 그것은 또한 나를 도왔다. 나는 그 라인과의 거래가 무엇인지 모른다; 요세미티 이전에 내 시스템에 있던 것 같습니다.
mislav

정말 고맙습니다. 그래도 코어에서 왜 IPv4보다 루프백 장치로 IPv6을 선호하는지 궁금합니다. 이것은 요세미티에서 나에게만 시작되었습니다.
lukecampbell

24

대안 (sudo 또는 수정이 필요하지 않음 /etc/hosts) -curl이 더 똑똑해질 때까지 항상 ipv4를 사용하십시오.

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

(모든 것이 원하는대로 작동합니다)


감사합니다.이 문제로 인해 문제가 발생했지만 솔루션이 완벽하게 작동했습니다.
Kyle Fox

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.0IPv4를합니다.

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에서 언급했듯이 해당 항목은 기본 모드 (IPv6 또는 IPv4 중 가장 먼저 curl해결 localhost되는 것으로 가정)에서 해석 할 때 선택된 항목입니다 .

그것을 강제 --ipv4@CharlesHebdough 제안으로, 만들 것이다, 모드 curl결의 localhost127.0.0.1(다른 IPv4의 항목에 대해이없는 가정 localhost에서을 /etc/hosts).

각 구현은 localhost원하는대로 해결 되므로 다른 도구로 간헐적으로 성공한 이유는 무엇입니까?

가장 정확한 정보를 얻으려면 127.0.0.1localhost 대신 사용하십시오 . 그러나 IPv4로 연결됩니다. localhost는 IPv6 및 IPv4 프로토콜 모두에서 작업 할 수있는 유연성을 제공하지만 일부 구현에서는 특정 버전의에서와 같이 문제가있을 수 있습니다 curl.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.