Получение записи DNS TXT в Ruby - PullRequest
12 голосов
/ 26 мая 2010

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

nslookup -q=txt xxxx.com

Ответы [ 6 ]

22 голосов
/ 26 мая 2010

Попробуйте установить 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 - печатает запись SPF Google)

См. Также ответ Алекса, более идиоматичный Руби - Алекс является автором dnsruby.

17 голосов
/ 05 мая 2014

Используйте библиотеку 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:dmarc-yahoo-rua@yahoo-inc.com, mailto:dmarc_y_rua@yahoo.com;"

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

7 голосов
/ 27 мая 2010
require 'dnsruby'
Dnsruby::DNS.open {|dns|
  dns.each_resource("google.com", "TXT") {|rr| print rr}
    # or
  print dns.getresource("google.com", "TXT")}
}
2 голосов
/ 09 июля 2015

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

Для получения записей TXT DNS

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
2 голосов
/ 26 мая 2010

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

0 голосов
/ 26 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...