为什么 java getHostName 给出 FQDN?

Why java getHostName gives the FQDN?

为什么有时 Java inetAddress.getHostName(); 给出完全限定的域名而有时只给出主机名而没有域? 是否可以在系统级别进行一些调整,以便仅通过调用该方法来获取 fqdn 或主机名。我知道 inetAddress.getCanonicalHostName() 在那里,但我想知道我们是否可以玩 getHostName()

Why does java getHostName sometime gives the FQDN and sometimes not?

简答:因为这取决于 OS.

提供的信息

在Java11中,InetAddress编辑的主机名return是通过JVM的DNS解析器对IP地址进行反向查找得到的。

JVM 的 DNS 解析器的默认行为是委托给 OS 提供的本地 DNS 解析器。也可以配置 Java 以使用一个简单的内置解析器,从文件中获取所有名称服务器数据;在 Java 9 发行说明中搜索 "jdk.net.hosts.file" 属性.

的说明

(在 Java 9 之前,实现不同但(据我所知)默认行为是使用 OS 提供的名称解析。)


I am looking at it on RHEL

(这不再是一个真正的 "programming" 问题,但这里是...)

在 Linux 上,反向查找变成对 getnameinfo(3) 的调用,这会调用解析器;有关完整详细信息,请参阅 Linux 手册条目。解析器行为取决于“/etc/nsswitch.conf”文件:特别是 "hosts" 行。例如在我的 (Ubuntu) 系统上它说:

hosts:  files mdns4_minimal [NOTFOUND=return] dns myhostname

这表示尝试在以下位置进行查找:

  1. "files" 表示“/etc/hosts”文件。
  2. "mdns4_minimal" 是一种 mDNS(多播 DNS)服务;见 https://askubuntu.com/a/853284/566610
  3. "dns" 是经典的集中式 DNS
  4. "myhostname" 是一个回退,它使用通常由 hostname 命令配置的系统信息。

因此,如果我在“/etc/hosts”文件中添加了主机 IP 地址的条目,那么该条目中的名字将是 getHostname returns .它可以是一个简单的名称或 FQDN,具体取决于文件的内容。这是一个例子:

192.168.1.1    bogsnorkel.example.com bogsnorkel

(我的 nsswitch.conf 设置如上,如果我的主 IP 是 192.168.1.1,getHostname() 会 return "bogsnorkel.example.com"。但是如果非限定名称 "bogsnorkel" 是第一个,它将 return 代替。)

但是如果没有“/etc/hosts”条目,那么下一步将是在 mDNS 或 DNS 中查找。如果 IP 已经注册到 mDNS / DNS,那么你应该得到一个 FQDN。

最后,回退将是使用 hostname 设置的任何内容。


退后一步:如果您正在寻找一种方法来确保您的应用程序始终从 inetAddress.getHostName() 获取 FQDN,而不管 OS 级别的配置等,那么您可能不走运:

  • 最好让您的应用程序对此 不敏感
  • 如果那不可能:
    1. 让您的应用程序检查主机名在启动时是否可接受,"bail out"如果不可接受。
    2. 将用户重定向到 OS 配置 FQDN 的说明
    3. 也许...为(非特权)用户无法修复 OS 是什么的情况提供选项或配置参数 returning。