内容简介:使用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亿的记录
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Game Engine Architecture, Second Edition
Jason Gregory / A K Peters/CRC Press / 2014-8-15 / USD 69.95
A 2010 CHOICE outstanding academic title, this updated book covers the theory and practice of game engine software development. It explains practical concepts and techniques used by real game studios,......一起来看看 《Game Engine Architecture, Second Edition》 这本书的介绍吧!