방금 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 프록시 설정에 대한 이 답변, 하지만 도움이 되지 않았습니다. 왜냐하면 이것이 작동하기 때문입니다:
$ wget --proxy=off localhost:8000
로컬에서 앱을 개발할 수 있도록 파일 에 몇 가지 다른 루프백 호스트 이름이 나열되어 있고 /etc/hosts
컬을 사용하여 디버깅하는 데 익숙하기 때문에 이는 정말 실망스럽습니다.
나는 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
그리고 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
답변1
/etc/hosts 파일에서 IPv6 루프백 라인 중 하나를 주석 처리하여 작동하게 했습니다.
#fe80::1%lo0 localhost
이제 localhost뿐만 아니라 모든 루프백 호스트 이름이 작동합니다. 이게 무슨 일인지 궁금해요?
답변2
대안(sudo 또는 수정이 필요하지 않음 /etc/hosts
)- 컬이 더 똑똑해질 때까지 항상 ipv4를 사용하십시오.
$ echo '--ipv4' >> ~/.curlrc
(그러면 모든 것이 원하는 대로 작동할 것입니다)
답변3
우선 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)
기호 는 IPv4의 기호 *
와 동일합니다 0.0.0.0
.
IPv6의 경우:
$ nc -l :: 8085
$ lsof -i6 -Pnl | grep 8085
nc 24145 [xxx] 3u IPv6 [xxx] 0t0 TCP *:8085 (LISTEN)
부호 는 IPv6 *
과 동일합니다 .::
공식 사양에 나온 대로.
그 이유는 에서 curl
임의의 항목을 확인하려고 시도하고 @NickRetallack이 언급했듯이 해당 항목은 기본 모드(가장 먼저 확인되는 IPv6 또는 IPv4)에서 확인할 때 선택되는 항목이기 때문입니다.localhost
/etc/hosts
curl
localhost
--ipv4
@CharlesHebdough가 제안한 대로 모드 로 강제 설정하면 curl
해결 localhost
됩니다 ( 에 127.0.0.1
대한 다른 IPv4 항목이 없다고 가정 ).localhost
/etc/hosts
각 구현은 localhost
원하는 대로 해결되므로 다양한 도구를 사용하여 간헐적으로 성공할 수 있습니다.
가장 정확하게 하려면 127.0.0.1
localhost 대신을 사용하십시오. 그러나 이렇게 하면 IPv4에 바인딩됩니다. localhost
는 IPv6 및 IPv4 프로토콜 모두에서 작업할 수 있는 유연성을 제공하지만 일부 구현에서는 특정 버전의 curl
.