如何找到本地主机的FQDN?

3

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

顺便提一下:net.LookupAddr()在Windows上不起作用,因此这不是一个选择。


不行,那样不能返回DNS后缀。 - undefined
你如何从操作系统中获取信息?在这方面,Go语言没有特定的方法。'USERDNSDOMAIN'环境变量是否已设置? - undefined
那样做是行不通的。这并不常见。获取连接的 DNS 后缀取决于操作系统。有 API 调用或者一个 /etc 文件。我发现 Go 语言没有提供跨操作系统的通用方法来获取它,你将不得不为每个操作系统自己编写该函数。对于 Windows,我需要调用 IpAdapterAddresses 系统调用;在 Linux 上,当我将应用程序移植到 CentOS 时,我将不得不弄清楚如何做。 - undefined
1
这就是我说的。如果主机登录到AD域,USERDNSDOMAIN会被设置,但可能不存在,但如果存在,这真的是你想要的吗?Go语言无法知道除了内核配置之外,你可能还想要什么。在Linux上,你想要第一个网络接口的PTR记录吗?还是你想要主机名加上resolv.conf中的“domain”条目?或者你想要本地地址在/etc/hosts中列出的第一个完全限定域名(FQDN)?或者你想要使用nswitch.conf从其他目录查找主机? - undefined
这没有意义。计算机经常不知道自己的FQDN,或者可能没有任何访问信息的方式。有很多种情况会导致这个失败。 - undefined
3个回答

4

默认情况下没有简短的方法。

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


3
根据文档,函数os.Hostname()返回内核报告的系统主机名。因此,如果您的计算机名为computer1,则os.Hostname()返回computer1。如果您的计算机名为computer1.my.office,则os.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

1
你可以使用网络库来进行一些体操,如这里所示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接