Mac OS X Yosemite पर कर्ल स्थानीय होस्ट नाम


30

मैंने अभी Mavericks से Yosemite में अपग्रेड किया है, और अब curlलूपबैक होस्ट नाम नहीं देख सकता।

परीक्षण करने के लिए एक सरल http सर्वर सेट करें:

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

अब मैं लोकलहोस्ट को हिट कर सकता हूं: क्रोम में 8000। मैं इसे भूल भी सकता हूं। लेकिन कर्ल में, ऐसा होता है:

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

हालाँकि, यह काम करता है:

$ curl 127.0.0.1:8000

मैंने इस उत्तर को wgetxy settings के बारे में पढ़ा , लेकिन इससे कोई फायदा नहीं हुआ, क्योंकि यह काम करता है:

$ wget --proxy=off localhost:8000

यह वास्तव में निराशाजनक है, क्योंकि मेरे पास कुछ अलग लूपबैक होस्टनाम हैं जो मेरी /etc/hostsफ़ाइल में सूचीबद्ध हैं, इसलिए मैं स्थानीय रूप से ऐप्स विकसित कर सकता हूं, और मुझे उन्हें कर्ल के साथ डीबग करने के लिए उपयोग किया जाता है।

मैंने कर्ल के संस्करण के साथ कोशिश की है कि ओएक्सएक्स के साथ जहाज:

$ 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

मैं एक ऐसी ही समस्या में एक नोड .js अनुप्रयोग के परीक्षण में भाग गया। मैंने देखा कि नोड के डिबगिंग ने कहा कि यह 0.0.0.0 के लिए बाध्यकारी था, और 'कर्ल -4 लोकलहोस्ट ...' की कोशिश की और यह काम किया, लेकिन -4 के बिना यह विफल रहा। ऐसा प्रतीत होता है कि IPv6 पते को IPv4 से पहले / etc / host से बाहर हल किया जा रहा है।
Neth

मैं उसी मुद्दे पर चल रहा हूं जिसका आपने निक वर्णन किया है।
nerdburn

जवाबों:


36

मुझे बस अपने / आदि / होस्ट फ़ाइल से IPv6 लूपबैक लाइनों में से एक पर टिप्पणी करके काम करने के लिए मिला:

#fe80::1%lo0    localhost

अब मेरे सभी लूपबैक होस्टनाम काम करते हैं, न कि केवल लोकलहोस्ट। मुझे आश्चर्य है कि इसके साथ क्या हो रहा है?


मेरे पास वह था और इसने मेरी मदद की। मुझे नहीं पता कि उस लाइन के साथ क्या हुआ है; यह देखता है कि मेरी प्रणाली योसेमाइट से पहले थी।
21

बहुत बहुत धन्यवाद। मुझे आश्चर्य है कि क्यों, कोर में यह आईपीवी 4 पर लूपबैक डिवाइस के लिए आईपीवी 6 का पक्षधर है। यह केवल मेरे लिए योसेमाइट पर होने लगा।
ल्यूककैम्पबेल

24

वैकल्पिक (सुडोल या संशोधित करने की आवश्यकता नहीं है /etc/hosts) - हमेशा आईपीवी 4 का उपयोग करें जब तक कि कर्ल चालाक न हो जाए।

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

(तब सब कुछ वांछित के रूप में काम करेगा)


धन्यवाद - यह समस्या मुझे पागल कर रही थी, लेकिन आपके समाधान ने पूरी तरह से काम किया।
काइल फॉक्स

2

सबसे पहले, 0.0.0.0एक विशेष पता है जिसका अर्थ है "कोई भी आईपीवी 4 पता"।

एक सॉकेट 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.0आईपीवी 4 पर।

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 ने उल्लेख किया है, उस प्रविष्टि को उसके डिफ़ॉल्ट मोड में curlहल करते समय चुना जाता localhostहै (निश्चित रूप से IPv6 या IPv4, जो भी पहले हल करता है)।

में यह जबरदस्ती --ipv4मोड, के रूप में @CharlesHebdough का सुझाव दिया, कर देगा curlसंकल्प localhostकरने के लिए 127.0.0.1(यह मानते हुए वहाँ के लिए कोई अन्य आईपीवी 4 प्रविष्टियों localhostमें /etc/hosts)।

प्रत्येक कार्यान्वयन localhostउनकी इच्छा के अनुसार हल होगा , इसलिए आपको विभिन्न उपकरणों के साथ रुक-रुक कर सफलता मिली।

सबसे सटीक संभव होने के लिए, 127.0.0.1लोकलहोस्ट के बजाय उपयोग करें , लेकिन यह आपको आईपीवी 4 के लिए बाध्य करेगा। localhostIPv6 और IPv4 दोनों प्रोटोकॉल में काम करने के लिए आपको लचीलापन देता है, हालाँकि कुछ कार्यान्वयन में आपको परेशानी हो सकती है, जैसा कि उस विशिष्ट संस्करण में है curl

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.