gpt4 book ai didi

java - 为什么 java getHostName 给出 FQDN?

转载 作者:行者123 更新时间:2023-12-02 01:12:18 25 4
gpt4 key购买 nike

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

最佳答案

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

简短回答:因为这取决于操作系统提供的信息。

<小时/>

在 Java 11 中,InetAddress 返回的主机名是通过使用 JVM 的 DNS 解析器对 IP 地址执行反向查找来获取的。

JVM 的 DNS 解析器的默认行为是委托(delegate)给操作系统提供的本地 DNS 解析器。还可以将 Java 配置为使用简单的内置解析器,从文件中获取所有名称服务器数据;在 Java 9 发行说明中搜索“jdk.net.hosts.file”属性的描述。

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

<小时/>

I am looking at it on 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 命令配置的系统信息的后备。

因此,如果我已将主机 IP 地址的条目添加到“/etc/hosts”文件中,则该条目中的第一个名称将是 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。

最后,后备将是使用主机名设置的任何内容。

<小时/>

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

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

关于java - 为什么 java getHostName 给出 FQDN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59207901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com