2015-05-05 26 views
8

Per il comando nslookup, dispone di nslookup somewhere.com some.dns.server.Perché la funzione golang Lookup *** non può fornire un parametro server?

Tuttavia, sembra che golang dnsclient solo carico config da /etc/resolv.conf

codice qui: https://golang.org/src/net/dnsclient_unix.go#L225

fa la libreria standard golang fornire qualcosa come func LookupTXT(name string, dnsServer string) (txt []string, err error)?

requirement: 1. Non modificare il valore predefinito /etc/resolv.conf.

+4

No, non è così. –

+1

Puoi provare questa libreria invece: https://github.com/miekg/dns –

+1

@Not_a_Golfer github.com/miekg/dns è troppo pesante per me. – holys

risposta

2

Le funzioni net.Lookup* forniscono l'accesso al resolver locale. Mentre molte richieste riceveranno risposta con le informazioni da un server DNS, questo non è sempre il caso.

Ad esempio, può restituire un nome dal file /etc/hosts. Oppure potrebbe utilizzare mDNS per risolvere un nome .local.

Se si desidera parlare con un server DNS arbitrario anziché con il resolver locale, è necessario utilizzare una libreria client DNS di interesse generale. Come suggerito nei commenti, https://github.com/miekg/dns potrebbe soddisfare le tue esigenze.

+0

grazie per il vostro consiglio. Ho creato un semplice [wrapper] (https://github.com/holys/nslookup) per il comando 'nslookup' per adattarlo al mio caso. – holys

+3

Se la preoccupazione era il sovraccarico, il bombardamento su nslookup è probabilmente più pesante di una libreria DNS in corso. –

14

@holys

"github.com/miekg/dns è troppo pesante per me"

Non è che pesante:

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) 
    } 
} 

Quando viene eseguito, si dovrebbe vedere :

$ 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

Grazie per l'applicazione di esempio, è molto utile. – Langston

5

@holys

È possibile utilizzare questo semplice dns_resolver sulla base 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 ha detto, "_github.com/miekg/dns è troppo pesante per me_" ma questo, github.com/bogdanovich/dns_resolver, è costruito ** sopra ** miekg/dns, quindi sta aggiungendo un altro livello, non "_semplice_" affatto. – xpt

Problemi correlati