讀取 /etc/hosts 的程序/應用程序或腳本
需要名稱解析時打開並讀取 /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 查找。可以在那裡放置其他值(例如
ldap
或nis
),這可以改變查找主機名的方式。這些常式通常稱為“命名服務”。相同的概念也用於使用者名查找 (
passwd
)、組條目 (group
) 等。因此,當您這樣做時
ping a.remote.host
,ping
程序將呼叫 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
,因此不需要解析器。