2010-05-26 36 views

回答

20

嘗試安裝dnsruby寶石。

該代碼被積極維護,並在一些重要的生產系統中使用。

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記錄)

又見@亞歷克斯的答案是更地道紅寶石 - 阿萊克斯是dnsruby作者。

+1

謝謝,它的作品完美。 – anusuya 2010-05-27 06:21:02

+0

鏈接不起作用。使用此[鏈接](https://github.com/alexdalitz/dnsruby) – Penguin 2016-07-28 01:39:39

2

嘗試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的頁上找到。

+0

我嘗試使用Net :: DNS :: Resolver.start(「waycoolblog.com」,Net :: DNS :: TXT)。但我數數得到txt字段的值。 我應該如何使用它? – anusuya 2010-05-26 13:45:25

+0

我認爲你正確地使用它,但它似乎損壞,並不實際返回TXT記錄,因爲它應該。抱歉。 – 2010-05-26 14:34:14

-3

或者使用系統( 「NSLOOKUP -q = TXT xxxx.com」)

+0

我想不使用system(),因爲它可能非常昂貴。 – anusuya 2010-05-26 13:49:06

+2

與DNS查找的成本相比,它不會很昂貴 – nfm 2013-04-26 05:39:52

+0

這隻適用於類Unix系統,而不適用於Windows或設備。它對於大多數生產應用程序來說都不是一個好的解決方案,但對於一次性腳本來說,它已經足夠好了@nfm:這個方法會更加昂貴,因爲你必須分叉一個進程,運行命令並且仍然執行DNS查找。 – Allen 2014-05-05 15:34:18

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

使用紅寶石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)的實例組成的數組。在這裏,如果沒有找到TXT記錄或主機名,我將返回nil,否則我會映射記錄,請撥打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

+0

很高興看到有人提出了一個內置的解決方案。謝謝! – siannopollo 2016-07-15 20:37:55

2

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