ชื่อโฮสต์โลคัล Curl บน Mac OS X Yosemite


30

ฉันเพิ่งอัพเกรดจาก 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ไฟล์ของฉันดังนั้นฉันจึงสามารถพัฒนาแอปในเครื่องได้และฉันก็เคยแก้จุดบกพร่องด้วยการม้วน

ฉันได้ลองกับเวอร์ชั่นของ curl ที่มาพร้อมกับ 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

และฉันได้พยายามรวบรวม curl กับ 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

ฉันพบปัญหาคล้ายกันในการทดสอบแอปพลิเคชัน node.js ฉันเห็นการแก้ไขข้อผิดพลาดของโหนดว่ามันผูกพันกับ 0.0.0.0 และลองใช้ 'curl -4 localhost ... ' และมันใช้งานได้ แต่ถ้าไม่มี -4 มันจะล้มเหลว ดูเหมือนว่าที่อยู่ IPv6 กำลังได้รับการแก้ไขจาก / etc / hosts ก่อนที่จะมีที่อยู่ IPv4
Neth

ฉันมีปัญหาเดียวกันกับที่คุณได้อธิบายนิค
nerdburn

คำตอบ:


36

ฉันแค่ให้มันทำงานโดยการคอมเม้นท์หนึ่งใน IPv6 loopback line จากไฟล์ / etc / hosts ของฉัน:

#fe80::1%lo0    localhost

ตอนนี้ชื่อโฮสต์ลูปแบ็คของฉันทั้งหมดทำงานได้ไม่ใช่แค่โฮสต์ท้องถิ่น ฉันสงสัยว่าเกิดอะไรขึ้นกับสิ่งนี้


ฉันมีสิ่งนั้นและมันก็ช่วยฉันเช่นกัน ฉันไม่รู้ว่าอะไรเกี่ยวข้องกับบรรทัดนั้น มันเห็นว่าระบบของฉันมีมาก่อนโยเซมิตี
mislav

ขอบคุณมาก. ฉันสงสัยว่าทำไมแกนหลักจึงสนับสนุน IPv6 สำหรับอุปกรณ์ลูปแบ็คผ่าน IPv4 สิ่งนี้เริ่มเกิดขึ้นกับฉันที่ Yosemite เท่านั้น
lukecampbell

24

ทางเลือก(ไม่ต้องใช้ sudo หรือแก้ไข/etc/hosts) - ใช้ ipv4 ทุกครั้งจนกว่า curl จะฉลาดขึ้น

$ 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.0ใน IPv4

สำหรับ 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(สมมติว่าไม่มีรายการอื่น ๆ สำหรับ IPv4 localhostใน/etc/hosts)

การใช้งานแต่ละครั้งจะแก้ไขได้localhostตามที่ต้องการดังนั้นทำไมคุณประสบความสำเร็จเป็นระยะ ๆ ด้วยเครื่องมือที่แตกต่างกัน

เพื่อให้เป็นไปได้อย่างแม่นยำที่สุดให้ใช้127.0.0.1แทน localhost แต่จะเชื่อมโยงคุณกับ IPv4 localhostช่วยให้คุณมีความยืดหยุ่นในการทำงานทั้งในโปรโตคอล IPv6 และ IPv4 curlแต่ในการใช้งานบางอย่างที่คุณอาจมีปัญหาเช่นเดียวกับในรุ่นที่เฉพาะเจาะจงของ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.