【问题标题】:getCanonicalHostName is returning unqualified namegetCanonicalHostName 正在返回不合格的名称
【发布时间】:2020-01-31 01:14:33
【问题描述】:

我有一些主机返回 InetAddress.getLocalHost().getCanonicalHostName()(Documented here) 的不合格名称 例如“foo”而不是“foo.example.com”。 什么可能导致此问题,我该如何解决?

在命令行上运行“hostname -f”会返回 FQDN 和短名称上的 nslookup 也返回 FQDN。

CentOS 7.7.1908

JRE 1.8.0_231-b11

【问题讨论】:

  • DNS 配置错误。
  • DNS 配置错误是什么意思?使用短名称运行 nslookup 会在好主机和坏主机上返回 FQDN。
  • 文档说 getCanonicalHostName() 获取此 IP 地址的完全限定域名。尽力而为的方法,这意味着我们可能无法根据底层系统配置返回 FQDN。说多了docs.oracle.com/javase/7/docs/api/java/net/…,如果这还不够,这里还有很多unix.stackexchange.com/questions/186859/…
  • 您是否尝试过在getCanonicalHostName 的JDK 中逐步调试实现?

标签: java java-8 centos7 hostname


【解决方案1】:

你能粘贴 /etc/hosts 文件的内容吗?

或 cat /etc/hosts | 的输出grep 本地主机

问题很可能存在,因为它没有为 127.0.0.1 定义 FQDN

【讨论】:

  • 它没有为 127.0.0.1 定义 FQDN,但我的任何其他主机也没有,它们工作正常。
【解决方案2】:

这可能是您机器的配置。检查域的 DNS 是否正确解析以及是否设置了域。

Java 将在 /etc/hosts 中查找或使用您的操作系统工具来执行名称地址以进行名称解析。

由于您正在寻找 localhost,您可能需要特定于主机的机制来解决它。

此外,您的机器可能有许多接口,并且并非所有接口都可以解析为相同的 FQDN。

枚举所有网络接口以查看问题可能会有所帮助:

        final Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while(networkInterfaces.hasMoreElements())
        {
            final NetworkInterface iface = networkInterfaces.nextElement();
            System.out.println("Interface: " + iface.getDisplayName());
            final Enumeration<InetAddress> inetAddresses = iface.getInetAddresses();
            while (inetAddresses.hasMoreElements())
            {
                final InetAddress addr = inetAddresses.nextElement();
                System.out.println(addr.getCanonicalHostName());
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多