Получение записи DNS TXT в Ruby

Мне нужно получить поле txt из записи DNS.
Есть ли какой-нибудь ruby ​​api, чтобы сделать что-то вроде этого?

nslookup -q=txt xxxx.com

Ответ 1

Попробуйте установить 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.

Ответ 2

Используйте библиотеку 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

Ответ 3

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

Ответ 4

Попробуйте 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, связанной выше.

Ответ 5

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

Ответ 6

Или используйте систему ( "nslookup -q = txt xxxx.com" )