在Ruby中获取DNS TXT记录

我需要从DNS记录中获取txt字段。
有没有ruby api做这样的事情?

nslookup -q=txt xxxx.com 

尝试安装dnsruby gem。

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

 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上测试的代码 – 打印Google SPF记录)

另见@ Alex的答案,这是更惯用的Ruby – Alex是dnsruby的作者。

使用Ruby stdlib Resolv::DNS库而不安装gem:

 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:dmarc-yahoo-rua@yahoo-inc.com, mailto:dmarc_y_rua@yahoo.com;" 

getresources返回所请求的记录类名称的实例数组( Resolv::DNS::Resource::IN::TXT )。 如果没有找到TXT记录或主机名,我返回nil,否则我映射记录,调用data获取值,然后将它们连接在一起。

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

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

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

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

试试Net :: DNS gem。

这是一个例子:

 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页面。

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 

或使用系统(“nslookup -q = txt xxxx.com”)