[英]Why is Java's InetAddress getHostName() not giving me the host's name?
[英]Why java getHostName gives the FQDN?
为什么有时,Java inetAddress.getHostName();
给出完全限定的域名,有时只给出没有域的主机名? 是否可以在系统级别进行调整以仅通过调用该方法来获取 fqdn 或主机名。 我知道inetAddress.getCanonicalHostName()
存在,但我想知道我们是否可以玩转getHostName()
。
为什么 java
getHostName
有时会提供 FQDN 而有时不会?
简短回答:因为它取决于操作系统提供的信息。
在 Java 11 中, InetAddress
返回的主机名是通过使用 JVM 的 DNS 解析器对 IP 地址执行反向查找来获得的。
JVM 的 DNS 解析器的默认行为是委托给操作系统提供的本地 DNS 解析器。 还可以将 Java 配置为使用简单的内置解析器,从文件中获取所有名称服务器数据; 在 Java 9 发行说明中搜索“jdk.net.hosts.file”属性的描述。
(在 Java 9 之前,实现不同,但(AFAIK)默认行为是使用操作系统提供的名称解析。)
我正在 RHEL 上查看
(这不再是真正的“编程”问题,但这里是......)
在 Linux 上,反向查找变成了对getnameinfo(3)
的调用,它使解析器调用; 有关完整详细信息,请参阅 Linux 手册条目。 解析器行为取决于“/etc/nsswitch.conf”文件:特别是“hosts”行。 例如在我的(Ubuntu)系统上,它说:
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname
这表示在以下位置尝试查找:
hostname
命令配置的系统信息。 因此,如果我在“/etc/hosts”文件中添加了主机 IP 地址的条目,那么该条目中的第一个名称将是getHostname
返回的内容。 它可以是一个简单的名称或 FQDN,具体取决于文件内容。 下面是一个例子:
192.168.1.1 bogsnorkel.example.com bogsnorkel
(使用上面的 nsswitch.conf 设置,如果我的主 IP 是 192.168.1.1, getHostname()
将返回“bogsnorkel.example.com”。但如果不合格的名称“bogsnorkel”是第一个,它会返回那个。 )
但是如果没有“/etc/hosts”条目,那么下一步将是在 mDNS 或 DNS 中查找。 如果 IP 已在 mDNS / DNS 中注册,那么您应该获得 FQDN。
最后,回退将是使用hostname
设置的任何内容。
退一步:如果您正在寻找一种方法来确保您的应用程序始终从inetAddress.getHostName()
获取 FQDN,而不管操作系统级别的配置等,那么您可能不走运:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.