内容简介:使用Golang获取域名的DNS记录, 包括A / CNAME等类型.只举例获取CNAME类型的解析记录, 其他类型大同小异.官方net包调用的是系统API, 所以在不同的系统上可能有不同的结果, 我测试当一个域名的解析记录如下时, linux和windows返回的结果不一致.
使用Golang获取域名的DNS记录, 包括A / CNAME等类型.
方案1: 官方net包
只举例获取CNAME类型的解析记录, 其他类型大同小异.
func CNAME(src string) (dst string, err error) {
dst, err = net.LookupCNAME(src)
return
}
官方net包调用的是系统API, 所以在不同的系统上可能有不同的结果, 我测试当一个域名的解析记录如下时, linux和windows返回的结果不一致.
bysir.xyz. 297 IN CNAME blog.bysir.top. blog.bysir.top. 60 IN CNAME bysir.top. bysir.top. 60 IN A 78.178.25.149
windows下 net.LookupCNAME
会返回第一层cname, 即 blog.bysir.top.
, linux下会返回第二层cname, 即 bysir.top.
.
而如果你想获取完整的解析记录, 或者是精确的第一层cname就需要用到下述的第二种方案了.
方案2: github.com/miekg/dns包
// CNAME2 返回所有层的cname
// src: 域名
// dnsService: dns服务器, 如114.114.114.114
func CNAME2(src string, dnsService string) (dst []string, err error) {
c := dns.Client{
Timeout: 5 * time.Second,
}
var lastErr error
// retry 3 times
for i := 0; i < 3; i++ {
m := dns.Msg{}
// 最终都会指向一个ip 也就是typeA, 这样就可以返回所有层的cname.
m.SetQuestion(src+".", dns.TypeA)
r, _, err := c.Exchange(&m, dnsService+":53")
if err != nil {
lastErr = err
time.Sleep(1 * time.Second * time.Duration(i+1))
continue
}
dst = []string{}
for _, ans := range r.Answer {
record, isType := ans.(*dns.CNAME)
if isType {
dst = append(dst, record.Target)
}
}
lastErr = nil
break
}
err = lastErr
return
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 域渗透——DNS记录的获取
- 用Python获取B站播放历史记录
- MapReduce实战 - 根据文章记录获取时段内发帖频率
- oppo快应用开通账号服务获取openid记录
- java – 获取mybatis中最后插入记录的id
- 黑客暗网出售攻击热门网站获取超7.44亿的记录
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java Web入门经典
王国辉、陈英 / 机械工业出版社 / 2013-6 / 69.00元
《Java Web入门经典》以初学者为核心,全面介绍了JavaWeb开发中常用的各种技术。内容排列上由浅入深,让读者循序渐进掌握编程技术;在内容讲解上结合丰富的图解和形象的比喻,帮助读者理解“晦涩难懂”的技术;在内容形式上附有大量的提示、技巧、说明等栏目,夯实读者编程技术,丰富编程经验。全书共分4篇19章,其中,第一篇为“起步篇”,主要包括开启JavaWeb之门、不可不知的客户端应用技术、驾驭Ja......一起来看看 《Java Web入门经典》 这本书的介绍吧!