在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”)