2010-05-26 37 views

回答

20

尝试安装dnsruby宝石。

该代码被积极维护,并在一些重要的生产系统中使用。

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 

(代码在MacOS X测试 - 打印谷歌SPF记录)

又见@亚历克斯的答案是更地道红宝石 - 阿莱克斯是dnsruby作者。

+1

谢谢,它的作品完美。 – anusuya 2010-05-27 06:21:02

+0

链接不起作用。使用此[链接](https://github.com/alexdalitz/dnsruby) – Penguin 2016-07-28 01:39:39

2

尝试Net::DNS宝石。

下面是一个例子:

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 " 

用于安装和使用的进一步说明可以上面链接GitHub的页上找到。

+0

我尝试使用Net :: DNS :: Resolver.start(“waycoolblog.com”,Net :: DNS :: TXT)。但我数数得到txt字段的值。 我应该如何使用它? – anusuya 2010-05-26 13:45:25

+0

我认为你正确地使用它,但它似乎损坏,并不实际返回TXT记录,因为它应该。抱歉。 – 2010-05-26 14:34:14

-3

或者使用系统( “NSLOOKUP -q = TXT xxxx.com”)

+0

我想不使用system(),因为它可能非常昂贵。 – anusuya 2010-05-26 13:49:06

+2

与DNS查找的成本相比,它不会很昂贵 – nfm 2013-04-26 05:39:52

+0

这只适用于类Unix系统,而不适用于Windows或设备。它对于大多数生产应用程序来说都不是一个好的解决方案,但对于一次性脚本来说,它已经足够好了@nfm:这个方法会更加昂贵,因为你必须分叉一个进程,运行命令并且仍然执行DNS查找。 – Allen 2014-05-05 15:34:18

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

使用红宝石STDLIB Resolv::DNS库,而无需安装宝石:

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返回请求记录类名(Resolv::DNS::Resource::IN::TXT)的实例组成的数组。在这里,如果没有找到TXT记录或主机名,我将返回nil,否则我会映射记录,请拨打data以获取值,然后将它们结合在一起。

任何DNS记录类型[TXT,NS,CNAME,MX,...]也可以通过替换上例中的TXT来查询。

TXT记录是“非结构化”的,用于主机名称的增强型数据,如SPF,DKIM,DMARC配置。实际上,可能只有一个TXT记录,但RFC没有说明可以有多少。

在阅读文档:http://www.ruby-doc.org/stdlib-2.1.1/libdoc/resolv/rdoc/index.html

+0

很高兴看到有人提出了一个内置的解决方案。谢谢! – siannopollo 2016-07-15 20:37:55

2

Ruby提供 “RESOLV” 线程感知的DNS解析库。 Resolv可以同时处理多个DNS请求,而不会阻塞整个Ruby解释器。

为获得DNS MX记录

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 

为获得DNS A记录

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 

为获得DNS TXT记录

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