我需要从 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
的作者。
不安装 gem 的情况下,可以使用 Ruby 标准库 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: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")}
}
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
尝试使用 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页面找到。
或者使用 system("nslookup -q=txt xxxx.com")