Мне нужно получить поле txt из записи DNS.
Есть ли какой-нибудь ruby api, чтобы сделать что-то вроде этого?
nslookup -q=txt xxxx.com
Мне нужно получить поле txt из записи DNS.
Есть ли какой-нибудь 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
без установки драгоценного камня:
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
). Здесь я возвращаю nil, если записи TXT или имя хоста не были найдены, иначе я сопоставляю записи, вызываю 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
require 'dnsruby'
Dnsruby::DNS.open {|dns|
dns.each_resource("google.com", "TXT") {|rr| print rr}
# or
print dns.getresource("google.com", "TXT")}
}
Попробуйте 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, связанной выше.
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" )