2010-05-26 32 views

Trả lời

20

Hãy thử cài đặt dnsruby đá quý.

Mã được duy trì tích cực và được sử dụng trong một số hệ thống sản xuất quan trọng.

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 

(Mã thử nghiệm trên hệ điều hành MacOS X - in kỷ lục của Google SPF)

Xem thêm @ câu trả lời của Alex đó là nhiều thành ngữ Ruby - Alex là tác giả của dnsruby.

+1

Cảm ơn, nó hoạt động hoàn hảo. – anusuya

+0

Liên kết không hoạt động. Sử dụng [link] này (https://github.com/alexdalitz/dnsruby) – Penguin

2

Thử đá quý Net::DNS.

Dưới đây là một ví dụ:

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 " 

hướng dẫn tiếp theo để cài đặt và sử dụng có thể được tìm thấy trên trang Github liên kết ở trên.

+0

tôi đã thử sử dụng Net :: DNS :: Resolver.start ("waycoolblog.com", Net :: DNS :: TXT). nhưng tôi đếm được giá trị cho trường txt. Tôi nên sử dụng nó như thế nào ?? – anusuya

+0

Tôi nghĩ rằng bạn đang sử dụng nó một cách chính xác, nhưng nó có vẻ bị hỏng và không thực sự trả lại bản ghi TXT như nó cần. Lấy làm tiếc. –

-3

Hoặc hệ thống sử dụng ("nslookup -q = txt xxxx.com")

+0

đang nghĩ đến việc không sử dụng với hệ thống() vì nó có thể rất tốn kém. – anusuya

+2

Nó sẽ không tốn kém so với chi phí tra cứu DNS – nfm

+0

Điều này sẽ chỉ hoạt động trên các hệ thống giống Unix, không hoạt động trên các cửa sổ hoặc thiết bị. Nó không phải là một giải pháp tốt cho hầu hết các ứng dụng sản xuất, nhưng hoạt động tốt cho các kịch bản một lần. @ nfm: Phương thức này sẽ tốn kém hơn khi bạn phải ngắt một quá trình, chạy lệnh và vẫn thực hiện tra cứu DNS. – Allen

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

Sử dụng Ruby stdlib thư viện Resolv::DNS mà không cần cài một viên ngọc:

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 trả về một mảng các trường hợp của tên yêu cầu lớp kỷ lục (Resolv::DNS::Resource::IN::TXT). Ở đây, tôi trả về nil nếu không tìm thấy bản ghi TXT hoặc tên máy chủ, nếu không tôi sẽ lập bản đồ qua các bản ghi, hãy gọi data để nhận các giá trị, sau đó ghép chúng lại với nhau.

Mọi loại bản ghi DNS [TXT, NS, CNAME, MX, ...] cũng có thể được truy vấn bằng cách thay thế TXT trong ví dụ trên.

Bản ghi TXT là "không có cấu trúc" và được sử dụng cho dữ liệu nâng cao cho tên máy chủ như cấu hình SPF, DKIM, DMARC. Trong thực tế, có thể chỉ có một bản ghi TXT, nhưng RFC không nói số lượng có thể có.

Đọc các tài liệu tại địa chỉ: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/resolv/rdoc/index.html

+0

Tốt để xem ai đó đề xuất giải pháp tích hợp. Cảm ơn! – siannopollo

2

của Ruby cung cấp "resolv" thư viện DNS resolver thread-biết. Resolv có thể xử lý đồng thời nhiều yêu cầu DNS mà không chặn toàn bộ thông dịch viên Ruby.

Để nhận được các bản ghi 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 

Để nhận được các bản ghi DNS Một

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 

Để nhận được các bản ghi 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 
Các vấn đề liên quan