Tại sao lệnh máy chủ không giải quyết các mục trong / etc / hosts?


25

Tôi có /etc/hoststệp sau trên máy ub 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

Tuy nhiên, lệnh máy chủ không phân giải tên puppetmasterchính xác, trong khi lệnh telnet thì không

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 '^]'.

Tại sao lệnh máy chủ không giải quyết các mục trong / etc / hosts?

Câu trả lời:


52

Các hostchương trình sử dụng libresolvđể thực hiện một truy vấn DNS trực tiếp, tức là không sử dụng gethostbyname.

Hầu hết các chương trình, khi cố gắng kết nối với máy chủ khác, sẽ gọi gethostbynamecuộc gọi hệ thống hoặc một chức năng tương tự. Hàm này tuân theo cấu hình của /etc/nsswitch.conf. Tệp này có một dòng trong Ubuntu 12.04 mặc định như sau:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

có nghĩa là lần đầu tiên nó sẽ sử dụng /etc/hosts, sau đó quay lại truy vấn DNS.

Nếu bạn muốn thực hiện tra cứu máy chủ theo cách này, bạn có thể thực hiện việc này với getent hosts. Ví dụ:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

Tôi hi vọng cái này giúp được.


2
Cảm ơn Kvisle, nhưng tôi vẫn hơi bối rối. Dòng trong /etc/nsswitch.conftrông như thế này hosts: files dnsvà tôi đã thay đổi nó thành hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4tuy nhiên trong cả hai trường hợp /etc/hostskhông được truy vấn, thay vào đó nó xuất hiện các truy vấn dns trực tiếp được thực hiện. Làm thế nào tôi có thể đảm bảo rằng /etc/hostssẽ được truy vấn đầu tiên khi sử dụng một lệnh như dighay host?
dùng784637

4
Bạn không thể. đào / máy chủ sử dụng DNS trực tiếp. Nếu bạn cần thực hiện một bảng tên để kiểm tra tệp máy chủ trước tiên, bạn phải sử dụng getent hostshoặc một cái gì đó khác sử dụnggethostbyname()
Kvisle

Ồ tôi hiểu rồi, xấu của tôi, tôi đã nhận nó ngay bây giờ =)
user784637

1
Tôi tin rằng ngày nay người ta nên sử dụng getent ahoststhay getent hostsgetent hostssử dụng gethostbyaddr()hoặc gethostbyname*()đã lỗi thời. Nếu tôi đã hiểu chính xác, hãy getent hostsmô phỏng cách các chương trình UNIX C cũ được sử dụng để làm việc và getent ahostsmô phỏng cách các chương trình moderm nên hoạt động.
Mikko Rantalainen

Nhưng có cách nào để làm cho lệnh máy chủ cũng sử dụng / etc / hosts không?
Kornel

10

Bởi vì hosttiện ích này chỉ là một tiện ích tra cứu DNS.

Hầu hết các ứng dụng sử dụng các cuộc gọi thư viện getaddrinfohoặc gethostbyname. Các thư viện này thẩm vấn một tệp được gọi /etc/nsswitch.confđể xác định mức độ ưu tiên tra cứu và chính sách về cách thực hiện các tra cứu khác nhau.

Thường /etc/nsswitch.confchứa dòng

hosts:        files dns

Điều này cho biết một chương trình trước tiên thẩm vấn /etc/hostsvà sau đó thẩm vấn DNS nếu không thành công.

Vì các máy chủ không chỉ tra cứu DNS nên nó không nhìn trộm /etc/hostsđể thực hiện tra cứu.


3

Bạn sẽ tìm thấy điều đó dignslookuphành xử giống như host.

Lý do cho điều này là mục đích của tất cả các lệnh này là để thực hiện tra cứu DNS, chứ không phải để tìm trong các tệp.

Hầu hết các chương trình khác sử dụng trình giải quyết tên của hệ điều hành /etc/nsswitch.conf, sau đó (nếu được yêu cầu) /etc/resolv.confđể quyết định cách giải quyết tên máy chủ bạn đang yêu cầu. (Đây là một sự đơn giản hóa, có các tùy chọn khác.) nsswitch.confTệp thường được ưu tiên trên các tệp cục bộ hơn là DNS.



-1

kiểm tra tập tin /etc/nsswitch.conf và tìm dòng bắt đầu bằng từ "hosts"? Bạn có thấy từ "tập tin" trên dòng này không? Nếu có, nó là trước hay sau từ "dns"?

Trên một hệ thống bình thường, dòng này sẽ giống như

hosts      files dns

nếu bạn không có mặt hoặc theo thứ tự khác, đó có thể là vấn đề của bạn.


Nó hiện diện và trông như thế nàyhosts: files dns
user784637
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.