在Ruby中获取DNS TXT记录

时间:2010-05-26 13:13:17

标签: ruby dns

我需要从DNS记录中获取文本字段 有没有红宝石api做这样的事情?

nslookup -q=txt xxxx.com

6 个答案:

答案 0 :(得分:22)

尝试安装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的作者。

答案 1 :(得分:16)

使用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

答案 2 :(得分:7)

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

答案 3 :(得分:2)

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

答案 4 :(得分: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

答案 5 :(得分:-3)

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