2015-05-05 19 views
8

Dla komendy nslookup ma ona nslookup somewhere.com some.dns.server.Dlaczego funkcja wyszukiwania Golang *** nie może dostarczyć parametru serwera?

Jednak wydaje się, że golang DNSClient tylko config obciążenie z /etc/resolv.conf

kod tutaj: https://golang.org/src/net/dnsclient_unix.go#L225

Czy biblioteka standardowa golang zapewnić coś takiego func LookupTXT(name string, dnsServer string) (txt []string, err error)?

requirement: 1. Nie zmieniaj wartości domyślnej /etc/resolv.conf.

+4

Nie, tak nie jest. –

+1

Możesz wypróbować tę bibliotekę: https://github.com/miekg/dns –

+1

@Not_a_Golfer github.com/miekg/dns jest dla mnie zbyt ciężki. – holys

Odpowiedz

2

Funkcje net.Lookup* zapewniają dostęp do lokalnego przelicznika. Podczas gdy na wiele zapytań będą odbierane informacje z serwera DNS, nie zawsze tak jest.

Na przykład może zwrócić nazwę z pliku /etc/hosts. Lub może użyć mDNS do rozwiązania nazwy .local.

Jeśli chcesz rozmawiać z dowolnym serwerem DNS, a nie lokalnym tłumaczem, powinieneś użyć ogólnej biblioteki klienta DNS. Jak zasugerowano w komentarzach, https://github.com/miekg/dns może pasować do twoich potrzeb.

+0

dzięki za radę. Zrobiłem prosty [wrapper] (https://github.com/holys/nslookup) dla polecenia 'nslookup', pasujące do mojego przypadku. – holys

+3

Jeśli twoja troska była nadmiarowa, wtedy wyłuskanie do nslookup prawdopodobnie będzie większe niż w procesowej bibliotece DNS. –

14

@holys

"github.com/miekg/dns jest zbyt ciężki dla mnie"

To nie jest takie ciężkie:

package main 

import (
    "log" 

    "github.com/miekg/dns" 
) 

func main() { 

    target := "microsoft.com" 
    server := "8.8.8.8" 

    c := dns.Client{} 
    m := dns.Msg{} 
    m.SetQuestion(target+".", dns.TypeA) 
    r, t, err := c.Exchange(&m, server+":53") 
    if err != nil { 
     log.Fatal(err) 
    } 
    log.Printf("Took %v", t) 
    if len(r.Answer) == 0 { 
     log.Fatal("No results") 
    } 
    for _, ans := range r.Answer { 
     Arecord := ans.(*dns.A) 
     log.Printf("%s", Arecord.A) 
    } 
} 

Po uruchomieniu należy zobaczyć :

$ go run dns.go 
2015/07/26 00:24:46 Took 16.138928ms 
2015/07/26 00:24:46 134.170.188.221 
2015/07/26 00:24:46 134.170.185.46 
+0

Dziękujemy za przykładową aplikację, która jest bardzo przydatna. – Langston

5

@holys

Można to wykorzystać prosty dns_resolver podstawie miekg/DNS

go get github.com/bogdanovich/dns_resolver 
package main 

import (
    "log" 
    "github.com/bogdanovich/dns_resolver" 
) 

func main() { 
    resolver := dns_resolver.New([]string{"8.8.8.8", "8.8.4.4"}) 

    // In case of i/o timeout 
    resolver.RetryTimes = 5 

    ip, err := resolver.LookupHost("google.com") 
    if err != nil { 
     log.Fatal(err.Error()) 
    } 
    log.Println(ip) 
    // Output [216.58.192.46] 
} 
+0

OP powiedział: "_github.com/miekg/dns jest dla mnie za ciężki", ale ten, github.com/bogdanovich/dns_resolver, jest zbudowany ** na górze ** miekg/dns, więc dodaje kolejną warstwę, w ogóle nie "_proste". – xpt

Powiązane problemy