繁体   English   中英

为什么 java getHostName 会给出 FQDN?

[英]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

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

  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返回的内容。 它可以是一个简单的名称或 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,而不管操作系统级别的配置等,那么您可能不走运:

  • 最好让您的应用程序对此不敏感
  • 如果这是不可能的:
    1. 让您的应用程序检查主机名在启动时是否可接受,如果不是,则“退出”。
    2. 将用户重定向到用于配置 FQDN 的操作系统说明
    3. 也许...为(非特权)用户无法修复操作系统返回的内容提供选项或配置参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM