Curl tên máy chủ cục bộ trên Mac OS X Yosemite


30

Tôi vừa nâng cấp từ Mavericks lên Yosemite và bây giờ curlkhông thể thấy tên máy chủ loopback.

Thiết lập một máy chủ http đơn giản để kiểm tra:

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

Bây giờ tôi có thể nhấn localhost: 8000 bằng chrome. Tôi thậm chí có thể quên nó. Nhưng trong curl, điều này xảy ra:

$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

Tuy nhiên, điều này hoạt động:

$ curl 127.0.0.1:8000

Tôi đã đọc câu trả lời này về cài đặt proxy wget , nhưng nó không có ích, bởi vì điều này hoạt động:

$ wget --proxy=off localhost:8000

Điều này thực sự gây nản lòng, vì tôi có một vài tên máy chủ loopback khác nhau được liệt kê trong /etc/hoststệp của mình để tôi có thể phát triển ứng dụng cục bộ và tôi thường sử dụng để gỡ lỗi chúng bằng curl.

Tôi đã thử với phiên bản curl mà tàu có 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

Và tôi đã thử biên dịch curl với 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

Tôi gặp vấn đề tương tự khi kiểm tra ứng dụng node.js. Tôi thấy việc gỡ lỗi của nút đó nói rằng nó đã liên kết với 0.0.0.0 và đã thử 'curl -4 localhost ...' và nó đã hoạt động, nhưng không có -4 thì nó đã thất bại. Có vẻ như địa chỉ IPv6 đang được giải quyết ngoài / etc / hosts trước địa chỉ IPv4.
Neth

Tôi có cùng một vấn đề bạn đã mô tả Nick.
nerdburn

Câu trả lời:


36

Tôi vừa làm cho nó hoạt động bằng cách nhận xét một trong các dòng loopback IPv6 từ tệp / etc / hosts của tôi:

#fe80::1%lo0    localhost

Bây giờ tất cả các tên máy chủ loopback của tôi hoạt động, không chỉ localhost. Tôi tự hỏi những gì với điều này?


Tôi đã có điều đó và nó cũng giúp tôi. Tôi không biết thỏa thuận với dòng đó là gì; nó thấy hệ thống của tôi đã có nó từ trước Yosemite.
mislav

Cảm ơn bạn rất nhiều. Mặc dù vậy, tôi tự hỏi, tại sao cốt lõi, nó lại ưu tiên IPv6 cho thiết bị loopback qua IPv4. Điều này chỉ bắt đầu xảy ra với tôi trên Yosemite.
lukecampbell

24

Thay thế (không yêu cầu sudo hoặc sửa đổi /etc/hosts) - luôn sử dụng ipv4 cho đến khi curl trở nên thông minh hơn.

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

(sau đó mọi thứ sẽ hoạt động như mong muốn)


Cảm ơn - vấn đề này đã khiến tôi phát điên, nhưng giải pháp của bạn đã hoạt động hoàn hảo.
Kyle Fox

2

Trước hết, 0.0.0.0là một địa chỉ đặc biệt có nghĩa là "bất kỳ địa chỉ IPv4".

Một ổ cắm có thể được liên kết với giao thức IPv4 hoặc IPv6. Nếu một ổ cắm bị ràng buộc 0.0.0.0, điều đó có nghĩa là nó sẽ lắng nghe bất kỳ IPv4 nào đang cố gắng kết nối với nó và sẽ được trình bày như sau:

$ nc -l 0.0.0.0 8085
$ lsof -i4 -Pnl | grep 8085
  nc        23994 [xxx]    3u  IPv4 [xxx]      0t0  TCP *:8085 (LISTEN)

Các *dấu hiệu tương đương với0.0.0.0 trên IPv4.

Đối với IPv6:

$ nc -l :: 8085
$ lsof -i6 -Pnl | grep 8085
  nc        24145 [xxx]    3u  IPv6 [xxx]      0t0  TCP *:8085 (LISTEN)

Các *dấu hiệu tương đương với ::trên IPv6, như trong đặc tả chính thức .

Lý do là vì curlcố gắng giải quyết localhostmục nhập ngẫu nhiên /etc/hostsvà như @NickRetallack đã đề cập, mục đó là mục được chọn curlkhi giải quyếtlocalhost ở chế độ mặc định của nó (giả sử IPv6 hoặc IPv4, bất cứ điều gì giải quyết trước).

Buộc nó trong --ipv4chế độ, như @CharlesHebdough đề nghị, sẽ làm cho curlquyết tâm localhostđến 127.0.0.1(giả sử không có mục IPv4 khác để localhost/etc/hosts ).

Mỗi thực hiện sẽ giải quyết localhost theo ý muốn, do đó tại sao bạn có thành công không liên tục với các công cụ khác nhau.

Để chính xác nhất có thể, hãy sử dụng 127.0.0.1thay vì localhost, nhưng nó sẽ ràng buộc bạn với IPv4. localhostmang lại cho bạn sự linh hoạt để làm việc trong cả giao thức IPv6 và IPv4, tuy nhiên trong một số triển khai bạn có thể gặp sự cố, như trong phiên bản cụ thể đó curl.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.