为啥 InetAddress.getLocalHost().getHostName() 返回与 bash“主机名”不同的值?

Posted

技术标签:

【中文标题】为啥 InetAddress.getLocalHost().getHostName() 返回与 bash“主机名”不同的值?【英文标题】:Why does InetAddress.getLocalHost().getHostName() return a value different from bash "hostname"?为什么 InetAddress.getLocalHost().getHostName() 返回与 bash“主机名”不同的值? 【发布时间】:2012-06-24 00:36:36 【问题描述】:

我有一个 build.gradle 任务,它在我的开发盒上像冠军一样工作,生成一个属性文件,记录生成构建的机器的名称。逻辑很简单……

def hostname = InetAddress.getLocalHost().getHostName();

在我的开发机器上,这总是产生与我从 bash shell 中生成主机名相同的值。

bobk-mbp:DM_Server bobk$ hostname
bobk-mbp.local

然而,在我们的 jenkins CI 服务器上,bash 主机名返回一件事,但我调用 InetAddress.getLocalHost().getHostName();返回别的东西。要让这两个返回相同的值,需要在 jenkins 机器上进行哪些更改?

【问题讨论】:

【参考方案1】:

假设你在 linux 上,从 o/s 执行的 hostname 命令返回内核配置的主机名。

InetAddress.getHostName() 正在使用您的操作系统中配置的命名服务 (DNS) 对服务器的 IP 地址进行反向查找。

如果您需要操作系统理解的主机名,通过 System.getenv 从环境变量中获取它可能是最简单的选择。这不是一种完全可靠的方法,但它可能就足够了,无需深入研究网络或系统管理员。

【讨论】:

差不多了。甚至比环境变量更简单的是从 gradle 到 exec 主机名(“hostname”.execute().text)。为我工作。谢谢。 我不得不使用"hostname".execute().text.trim() 来删除尾随的换行符。【参考方案2】:

来自 InetAddress.getHostName() 的 API 文档;

如果这个 InetAddress 是用一个主机名创建的,这个主机名将被记住并返回;否则,将执行反向名称查找,并根据系统配置的名称查找服务返回结果。如果需要查找名称服务,请调用 getCanonicalHostName。

因此您可能需要在 Jenkins 服务器上配置 DNS。最简单的方法是编辑 /etc/hosts(我假设你的 Jenkins 在 Linux 上运行)并确保它看起来像这样:

127.0.0.1           localhost       localhost.localdomain
<public IP address> <hostname>      <hostname>.<domain>

【讨论】:

嗯。我们的 /etc/hosts 看起来很像 [127.0.0.1 localhost.localdomain localhost] 但 InetAddress.getHostName() 的输出是“ab”。我倾向于 "hostname".execute().text 并称之为好。 这实际上与 /etc/hosts 的期望顺序相反,规范名称(带域)元素应位于主机名之前。 man7.org/linux/man-pages/man5/hosts.5.html

以上是关于为啥 InetAddress.getLocalHost().getHostName() 返回与 bash“主机名”不同的值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?