2010-05-26 14 views

Respuesta

20

Intente instalar la gema dnsruby.

El código se mantiene activamente y se usa en algunos sistemas de producción importantes.

require 'rubygems' 
require 'dnsruby' 
include Dnsruby 

# Use the system configured nameservers to run a query 
res = Dnsruby::Resolver.new 
ret = res.query("google.com", Types.TXT) 
print ret.answer 

(Código probados en MacOS X - imprime el registro Google SPF)

Véase también la respuesta de Alex @ que es más idiomático Ruby - Alex es el autor de dnsruby.

+1

Gracias, funciona perfecto. – anusuya

+0

El enlace no funciona. Use este [enlace] (https://github.com/alexdalitz/dnsruby) – Penguin

2

Probar el Net::DNS gem.

Aquí se muestra un ejemplo:

result = Net::DNS::Resolver.start("google.com", Net::DNS::TXT) 
values = result.each_mx.map { |r| r.txt } 
# "v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all " 

Otras instrucciones para la instalación y uso se pueden encontrar en la página de Github vinculado anteriormente.

+0

intenté usar Net :: DNS :: Resolver.start ("waycoolblog.com", Net :: DNS :: TXT). pero cuento obtener el valor para el campo txt. ¿cómo debería estar realmente usándolo? – anusuya

+0

Creo que lo está usando correctamente, pero parece estar roto y en realidad no devuelve el registro TXT como debería. Lo siento. –

-3

O sistema de uso ("nslookup -q = txt xxxx.com")

+0

estoy pensando en no usar con el sistema() ya que puede ser muy caro. – anusuya

+2

No será costoso en comparación con el costo de una búsqueda de DNS – nfm

+0

Esto solo funcionaría en sistemas tipo Unix, no en ventanas o dispositivos. No es una buena solución para la mayoría de las aplicaciones de producción, pero funciona lo suficientemente bien para scripts únicos. @nfm: este método será más costoso ya que debe bifurcar un proceso, ejecutar el comando y aún hacer la búsqueda de DNS. – Allen

6
require 'dnsruby' 
Dnsruby::DNS.open {|dns| 
    dns.each_resource("google.com", "TXT") {|rr| print rr} 
    # or 
    print dns.getresource("google.com", "TXT")} 
} 
15

Utilice el Rubí stdlib Resolv::DNS biblioteca sin necesidad de instalar una joya:

require 'resolv' 
txt = Resolv::DNS.open do |dns| 
    records = dns.getresources("_dmarc.yahoo.com", Resolv::DNS::Resource::IN::TXT) 
    records.empty? ? nil : records.map(&:data).join(" ") 
end 
#=> "v=DMARC1; p=reject; sp=none; pct=100; rua=mailto:[email protected], mailto:[email protected];" 

getresources devuelve una matriz de instancias del nombre solicitado clase registro (Resolv::DNS::Resource::IN::TXT). Aquí, devuelvo nulo si los registros de TXT o el nombre de host no se encontraron, de lo contrario hago un mapa de los registros, llamo al data para obtener los valores, luego los uniré.

Cualquier tipo de registro DNS [TXT, NS, CNAME, MX, ...] se puede consultar también reemplazando TXT en el ejemplo anterior.

Los registros TXT están "desestructurados" y se utilizan para datos mejorados para el nombre de host, como las configuraciones SPF, DKIM, DMARC. En la práctica, puede haber solo un registro TXT, pero el RFC no dice cuántos puede haber.

Lea los documentos en: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/resolv/rdoc/index.html

+0

Es bueno ver que alguien sugiera una solución integrada. ¡Gracias! – siannopollo

2

Rubí proporciona "Resolv" una biblioteca de resolución de DNS hilo-conscientes. Resolv puede manejar múltiples solicitudes de DNS al mismo tiempo sin bloquear todo el intérprete de Ruby.

Para la obtención de los registros MX de DNS

require "resolv" 
    Resolv::DNS.open do |dns| 
     ress = dns.getresources "infoir.com", Resolv::DNS::Resource::IN::MX 
     p ress.map { |r| [r.exchange.to_s, r.preference] } 
    end 

Para los registros DNS A para conseguir

require "resolv" 
    Resolv::DNS.open do |dns| 
     ress = dns.getresources "infoir.com", Resolv::DNS::Resource::IN::A 
     p ress.map { |r| [r.exchange.to_s, r.preference] } 
    end 

para obtener registros TXT DNS

require "resolv" 
Resolv::DNS.open do |dns| 
    ress = dns.getresources "infoir.com", Resolv::DNS::Resource::IN::TXT 
    p ress.map { |r| [r.exchange.to_s, r.preference] } 
end 
Cuestiones relacionadas