ネームサーバーの動作確認をするのに dig
コマンドを使って問い合わせを試していたが、Rubyでスクリプト化する際にコマンド呼び出しではなくRubyのライブラリでできないかと思い、方法を調べた。
dig +short
のように結果のみでいいのならば、標準ライブラリの resolv
で代替できそう。
bash
dig @8.8.8.8 +short +time=1 +tries=3 google.co.jp. any
dig @8.8.8.8 +short +time=1 +tries=3 google.co.jp.
dig @8.8.8.8 +short +time=1 +tries=3 -x 8.8.4.4
↓
ruby
require 'resolv'
Resolv::DNS.open(nameserver: "8.8.8.8") do |dns| # ブロックなら DNS#close を自動でする
dns.timeouts = [1, 1, 1] # リトライ毎にタイムアウトを変えられる
p dns.getresources("google.co.jp.", Resolv::DNS::Resource::IN::ANY)
p dns.getaddresses("google.co.jp.")
p dns.getnames("8.8.4.4")
nil # ブロックの戻り値、今回は明示的に空にしておく
end
結果を得るメソッドは、 resource, address, name それぞれに3種類ある。
-
getXXXs
は全ての結果を配列で返す(見つけられなければ空配列) -
getXXX
は最初の結果のみを返す(見つけられなければ例外Resolv::ResolvError
発生) -
each_XXX
は全ての結果をイテレーションできる