Linux

讀取 /etc/hosts 的程序/應用程序或腳本

  • February 15, 2019

需要名稱解析時打開並讀取 /etc/hosts 的程序或腳本的名稱是什麼?每個 linux/unix 發行版都不同嗎?

我閱讀了主機的手冊頁並嘗試使用 whereis 查找名為 hosts 的二進製文件,但 whereis 輸出文件名,例如 /etc/hosts.allow 和 /etc/hosts.deny。我的印像是 hosts.allow 和 hosts.deny 是 TCPWrappers 的配置文件,現在我比開始時更加困惑。

沒有解析此文件的特定程序。

許多標准文件(例如/etc/hosts)由標準庫文件(例如gethostbyname(3))解析。然而,故事可能要復雜得多。

主機名解析通常由/etc/nsswitch.conf.

例如

% grep hosts /etc/nsswitch.conf
hosts:      files dns

該條目告訴解析器常式使用“文件”後端,如果在那裡找不到結果,則進行 DNS 查找。可以在那裡放置其他值(例如ldapnis),這可以改變查找主機名的方式。

這些常式通常稱為“命名服務”。相同的概念也用於使用者名查找 ( passwd)、組條目 ( group) 等。

因此,當您這樣做時ping a.remote.hostping程序將呼叫 glibc 庫函式,這將載入nsswitch.conf. 結果是您不會看到特定的程序來進行查找;ping通過庫和 NS 常式自己完成工作。

有一個程序getent可以用來進行名稱搜尋;您指定一個“數據庫”( 中的條目之一nsswitch.conf)和您要搜尋的值。

所以

getent hosts a.remote.host

將按照中定義的規則進行名稱查找nsswitch.conf。這對於測試目的很有用,有時在腳本中也很有用。

— 附錄 —-

此資訊來自斯蒂芬在下面的評論,但非常有用,因此我將其添加到他的答案中。

strace getent hosts www.google.com 2>&1 | grep libnss_

將告訴使用哪個庫(或沒有)來解析名稱。如果它說libnss_files/etc/hosts則被使用。如果顯示libnss_dns,則使用了 DNS。libnss_myhostname意味著沒有任何效果,並且備份 GNU 系統踢了它(並且可能已經失​​敗)。如果沒有列出庫,那麼您可能使用了數字地址,例如127.0.0.1,因此不需要解析器。

引用自:https://unix.stackexchange.com/questions/485556