【问题标题】:How do you find the FQDN of the local host?如何找到本地主机的 FQDN?
【发布时间】:2015-10-03 06:19:35
【问题描述】:

如何在 Go 中找到本地主机的 FQDN?

顺便说一句:net.LookupAddr() 在 Windows 上不起作用。所以这不是一个选择。

【问题讨论】:

  • 不。这不会返回 DNS 后缀。
  • 如何从操作系统获取信息?从这个意义上说,Go 没有什么特别之处。 'USERDNSDOMAIN' 环境变量设置了吗?
  • 那行不通。通常不设置。检索连接 DNS 后缀的位置取决于操作系统。有 api 调用或 /etc 文件。我发现 Go 没有提供跨操作系统的通用方法来获取它,您必须为每个操作系统自己编写函数。对于 Window,我需要调用 IpAdapterAddresses 系统调用;在 linux 上,当我将应用程序移植到 CentOS 时,我必须弄清楚。
  • 这就是我要说的。 IIRC USERDNSDOMAIN 是在主机登录到 AD 域时设置的,它可能不存在,但如果它是你真正想要的吗?除了内核中配置的内容之外,Go 无法知道您可能还想要什么。在 linux 上,您想要第一个网络接口的 PTR 记录,还是想要主机名加上来自 resolv.conf 的“域”条目,或者您想要 /etc/hosts 中列出的第一个 fqdn 作为本地地址,或者执行您想使用nswitch.conf 从其他目录查找主机吗?
  • 这没有意义。计算机通常不知道自己的 FQDN,或者可能没有任何方法可以访问信息。失败的方法有很多。

标签: go fqdn


【解决方案1】:

默认情况下没有捷径。

os.Hostname() 默认不提供完全限定域名。

cmd := exec.Command("/bin/hostname", "-f")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
    log.Errorf(err)
}
fqdn := out.String()
fqdn = fqdn[:len(fqdn)-1] // removing EOL

【讨论】:

    【解决方案2】:

    根据文档,函数os.Hostname()返回内核报告的系统主机名。因此,如果您的计算机名为 computer1,则 os.Hostname() 返回 computer1。如果您的计算机名为 computer1.my.officeos.Hostname() 将返回 computer1.my.office。在 Windows 上,也是一样的。如果您想要域名(称为 Active Directory 域),您有四种方法:

    1. 解析此命令的结果:wmic computersystem get domain
    2. 解析此命令的结果:systeminfo | findstr /B /C:"Domain"
    3. 假设存在环境变量USERDNSDOMAIN并计算其值(注意:该变量的值是在用户所在的域中引用的)
    4. 检查分配给工作站的其中一个 ip 是否可以通过 DNS 解析(此时,您可以查看:https://github.com/Showmax/go-fqdn

    【讨论】:

      【解决方案3】:

      您可以使用 net lib 进行一些体操,如 here 所示。

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 2012-07-26
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多