我是Go的新手,并試圖讓一個小型DNS程序工作,解析返回的A和CNAME記錄。這是在使用 github.com/miekg/dns 包。我無法理解如何正確解析 A 或 CNAME 的返回資源記錄。對于 A 記錄,我想獲取 IP 地址并將其存儲在變量中。對于返回了多個 RR 的 CNAME,我想解析“名稱”和“地址”字段并存儲在變量中。我嘗試過將結(jié)構(gòu)轉(zhuǎn)換為字符串或?qū)⑵浣鈮嚎s,但無濟于事。任何人都可以提供任何見解,非常感謝。下面是下面的代碼。文本文件包含一行帶有“www”:package mainimport ( "bufio" "fmt" "log" "os" "github.com/miekg/dns")func dns_request_fwd(s string) []dns.RR { //fmt.Println(s, " : started processing DNS request") m1 := new(dns.Msg) m1.Id = dns.Id() m1.RecursionDesired = true m1.Question = make([]dns.Question, 1) m1.Question[0] = dns.Question{s, dns.TypeA, dns.ClassINET} in, err := dns.Exchange(m1, "8.8.8.8:53") if err != nil { log.Fatal(err) } if len(in.Answer) > 0 { //fmt.Println("Response greater than 0 - got something!") //fmt.Println(in.Answer) } else { //fmt.Println("Empty DNS Response") return nil } if _, ok := in.Answer[0].(*dns.A); ok { //fmt.Println("Detected an 'A' record Answer. Returning RR!") return in.Answer } else if _, ok := in.Answer[0].(*dns.CNAME); ok { //fmt.Println("Detected a 'CNAME' record Answer. Returning RR!") return in.Answer } else { fmt.Println("Returning nil") return nil }}func main() { f, err := os.Open("list4.txt") if err != nil { log.Fatal(err) } defer f.Close() domain := "acme.com" domain_lookup := "." + domain + "." scanner := bufio.NewScanner(f) for scanner.Scan() { a_record := scanner.Text() lookup := a_record+domain_lookup fmt.Println("Looking up: ", lookup) dreq := dns_request_fwd(lookup)
1 回答

哈士奇WWW
TA貢獻1799條經(jīng)驗 獲得超6個贊
您不需要“解析”結(jié)構(gòu)。該庫已經(jīng)解析了響應,以便為您提供結(jié)構(gòu)。只需使用結(jié)構(gòu)中包含所需數(shù)據(jù)的字段,如 dns。A.A
,這是一張網(wǎng)。IP
或域名。別名。目標是
字符串。有關(guān)更多詳細信息,請參閱包文檔。
if arec, ok := dreq[0].(*dns.A); ok {
fmt.Println(" [+] Type is A")
fmt.Println(" [+] Answer: ", arec.A)
}
- 1 回答
- 0 關(guān)注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消