为啥 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,为啥它受到保护?