ทำไมคำสั่ง host ไม่แก้ไขรายการใน / etc / hosts


25

ฉันมี/etc/hostsไฟล์ต่อไปนี้บนเครื่อง ubuntu 12.04

127.0.0.1 localhost
10.248.27.66 ec2-50-112-220-110.us-west-2.compute.amazonaws.com puppetmaster

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

อย่างไรก็ตามคำสั่ง host ไม่สามารถแก้ไขชื่อpuppetmasterได้อย่างถูกต้องในขณะที่คำสั่ง telnet นั้นทำ

root@ip-10-248-34-162:/home/ubuntu# host puppetmaster
Host puppetmaster not found: 3(NXDOMAIN)

root@ip-10-248-34-162:/home/ubuntu# telnet puppetmaster 8140
Trying 10.248.27.66...
Connected to ec2-50-112-220-110.us-west-2.compute.amazonaws.com.
Escape character is '^]'.

ทำไมคำสั่ง host ไม่แก้ไขรายการใน / etc / hosts

คำตอบ:


52

hostโปรแกรมที่ใช้libresolvในการทำแบบสอบถาม DNS gethostbynameโดยตรงคือไม่ได้ใช้

โปรแกรมส่วนใหญ่เมื่อพยายามเชื่อมต่อกับโฮสต์อื่นให้เรียกการเรียกของgethostbynameระบบหรือฟังก์ชั่นที่คล้ายกัน /etc/nsswitch.confฟังก์ชั่นนี้เชื่อฟังการกำหนดค่าของ ไฟล์นี้มีบรรทัดที่ใน Ubuntu 12.04 ค่าเริ่มต้นต่อไปนี้:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

ซึ่งหมายความว่ามันจะใช้ครั้งแรก/etc/hostsจากนั้นย้อนกลับไปยังแบบสอบถาม DNS

getent hostsหากคุณต้องการที่จะดำเนินการเป็นเจ้าภาพการค้นหาด้วยวิธีนี้คุณสามารถทำเช่นนี้กับ ตัวอย่างเช่น:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

ฉันหวังว่านี่จะช่วยได้.


2
ขอบคุณ Kvisle แต่ฉันยังสับสนอยู่เล็กน้อย บรรทัดที่มี/etc/nsswitch.confลักษณะเช่นนี้hosts: files dnsและฉันเปลี่ยนเป็นhosts: files mdns4_minimal [NOTFOUND=return] dns mdns4อย่างไรก็ตามในทั้งสองกรณี/etc/hostsไม่ได้ถูกสอบถาม แต่ปรากฏว่ามีการสอบถาม DNS โดยตรง ฉันสามารถมั่นใจได้ว่า/etc/hostsจะได้รับการสอบถามครั้งแรกเมื่อใช้คำสั่งเหมือนdigหรือhost?
user784637

4
คุณทำไม่ได้ ขุด / โฮสต์ใช้ DNS โดยตรง หากคุณจำเป็นต้องทำ namelookup ที่ตรวจสอบไฟล์โฮสต์ก่อนคุณต้องใช้งานgetent hostsหรืออย่างอื่นที่ใช้gethostbyname()
Kvisle

โอ้ฉันเข้าใจแล้วฉันไม่ดีฉันได้รับทันที =)
user784637

1
ฉันเชื่อว่าทุกวันนี้ควรใช้อย่างใดอย่างหนึ่งgetent ahostsแทนที่จะใช้getent hostsเพราะการgetent hostsใช้งานgethostbyaddr()หรือgethostbyname*()ล้าสมัย หากฉันเข้าใจถูกต้องให้getent hostsเลียนแบบว่าโปรแกรม UNIX C รุ่นเก่าใช้งานอย่างไรและgetent ahostsเลียนแบบวิธีที่โปรแกรม moderm ควรทำงาน
Mikko Rantalainen

แต่มีวิธีที่จะทำให้คำสั่งโฮสต์ใช้ยัง / etc / hosts?
Kornel

10

เพราะhostยูทิลิตีนี้เป็นยูทิลิตีการค้นหา DNS โดยเฉพาะ

โปรแกรมส่วนใหญ่ใช้การเรียกร้องห้องสมุดหรือgetaddrinfo gethostbynameไลบรารีเหล่านี้สอบปากคำไฟล์ที่เรียกว่า/etc/nsswitch.confเพื่อกำหนดลำดับความสำคัญการค้นหาและนโยบายของวิธีการดำเนินการค้นหาที่แตกต่างกัน

โดยทั่วไปจะ/etc/nsswitch.confมีบรรทัด

hosts:        files dns

ซึ่งบอกให้โปรแกรมซักถามก่อน/etc/hostsแล้วจึงซักถาม DNS หากไม่สำเร็จ

เนื่องจากโฮสต์ทำการค้นหา DNS โดยเฉพาะจึงไม่มองที่/etc/hostsจะทำการค้นหา


3

คุณจะพบว่าdigและทำงานในลักษณะเดียวกับnslookuphost

เหตุผลสำหรับสิ่งนี้คือวัตถุประสงค์ของคำสั่งเหล่านี้คือการค้นหา DNS ไม่ใช่เพื่อค้นหาไฟล์

โปรแกรมอื่น ๆ ส่วนใหญ่ใช้โปรแกรมแก้ไขชื่อระบบปฏิบัติการที่ให้คำปรึกษา/etc/nsswitch.confและ (ถ้าจำเป็น) /etc/resolv.confเพื่อตัดสินใจว่าจะแก้ปัญหาชื่อโฮสต์ที่คุณร้องขอได้อย่างไร (นี่คือการทำให้เข้าใจง่ายและมีตัวเลือกอื่น ๆ ) โดยnsswitch.confปกติแล้วไฟล์มักจะมีความสำคัญเหนือกว่าในไฟล์โลคัลมากกว่า DNS



-1

ตรวจสอบไฟล์ /etc/nsswitch.conf แล้วมองหาบรรทัดที่ขึ้นต้นด้วยคำว่า "hosts" หรือไม่? คุณเห็นคำว่า "ไฟล์" ในบรรทัดนี้หรือไม่ ถ้าใช่มันเป็นก่อนหรือหลังคำว่า "dns"

ในระบบปกติบรรทัดนี้ควรมีลักษณะคล้ายกัน

hosts      files dns

หากคุณไม่อยู่หรืออยู่ในลำดับที่แตกต่างนั่นอาจเป็นปัญหา


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