python_nube Asked: 2018-12-03 12:48:27 +0800 CST2018-12-03 12:48:27 +0800 CST 2018-12-03 12:48:27 +0800 CST 读取 /etc/hosts 的程序/应用程序或脚本 772 需要名称解析时打开并读取 /etc/hosts 的程序或脚本的名称是什么?每个 linux/unix 发行版都不同吗? 我阅读了主机的手册页并尝试使用 whereis 查找名为 hosts 的二进制文件,但 whereis 输出文件名,例如 /etc/hosts.allow 和 /etc/hosts.deny。我的印象是 hosts.allow 和 hosts.deny 是 TCPWrappers 的配置文件,现在我比开始时更加困惑。 linux hosts 2 个回答 Voted Peschke 2018-12-03T13:04:03+08:002018-12-03T13:04:03+08:00 在 GNU/Linux 系统上,/etc/hosts通常由glibc库读取。 请参阅GNU关于该主题的文档: 在内部,系统使用数据库来跟踪主机名和主机号之间的映射。该数据库通常是文件 /etc/hosts 或名称服务器提供的等效文件。用于访问该数据库的函数和其他符号在 netdb.h 中声明。它们是 BSD 功能,如果包含 netdb.h,则无条件定义。 所有 POSIX 兼容的 UNIX 和类 UNIX 系统都将遵循此指南,因为 netdb.h 是POSIX 标准。主要区别在于它们使用的 C 库,因为并非所有 UNIX 系统都使用glibc. GNU 文档还讨论了gethostbyname读取gethostbyaddr从/etc/hosts. 这两个功能今天实际上已经过时了。getaddrinfo并且getnameinfo应该被使用。 Best Answer Stephen Harris 2018-12-03T13:18:00+08:002018-12-03T13:18:00+08:00 没有解析此文件的特定程序。 许多标准文件(例如/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,因此不需要解析器。
在 GNU/Linux 系统上,
/etc/hosts
通常由glibc
库读取。请参阅GNU关于该主题的文档:
所有 POSIX 兼容的 UNIX 和类 UNIX 系统都将遵循此指南,因为 netdb.h 是POSIX 标准。主要区别在于它们使用的 C 库,因为并非所有 UNIX 系统都使用
glibc
.GNU 文档还讨论了
gethostbyname
读取gethostbyaddr
从/etc/hosts
. 这两个功能今天实际上已经过时了。getaddrinfo
并且getnameinfo
应该被使用。没有解析此文件的特定程序。
许多标准文件(例如
/etc/hosts
)由标准库文件(例如gethostbyname(3)
)解析。然而,故事可能要复杂得多。主机名解析通常由
/etc/nsswitch.conf
.例如
此条目告诉解析器例程使用“文件”后端,如果在那里找不到结果,则进行 DNS 查找。可以在此处放置其他值(例如
ldap
或nis
),这可以改变查找主机名的方式。这些例程通常称为“命名服务”。相同的概念也用于用户名查找 (
passwd
)、组条目 (group
) 等。因此,当您这样做时
ping a.remote.host
,ping
程序将调用 glibc 库函数,该函数将加载nsswitch.conf
. 结果是您不会看到特定的程序来进行查找;ping
通过库和 NS 例程自己完成工作。有一个程序
getent
可以用来进行名称搜索;您指定一个“数据库”( 中的条目之一nsswitch.conf
)和您要搜索的值。所以
将按照中定义的规则进行名称查找
nsswitch.conf
。这对于测试目的很有用,有时在脚本中也很有用。--- 附录 ----
此信息来自斯蒂芬在下面的评论,但非常有用,因此我将其添加到他的答案中。
将告诉使用哪个库(或没有)来解析名称。如果它说
libnss_files
,/etc/hosts
则被使用。如果显示libnss_dns
,则使用了 DNS。libnss_myhostname
意味着没有任何效果,并且备份 GNU 系统踢了它(并且可能已经失败)。如果没有列出库,那么您可能使用了数字地址,例如127.0.0.1
,因此不需要解析器。