またタイトルで終わってしまった。
でヒントをもらったので Ruby で書いてみた。
#! /usr/bin/env ruby
require 'resolv'
require 'ipaddr'
def main()
host = ARGV.shift()
num_addrs = 0
if ( host )
begin
ipaddr = IPAddr.new( host )
output_names( ipaddr )
rescue
begin
num_addrs += output_addrs( Resolv::Hosts.new(), host )
ensure
num_addrs += output_addrs( Resolv::DNS.new(), host )
end
end
else
STDERR.puts "Usage: #{$0} hostname/FQDN|ipaddr"
end
exit num_addrs
end
def output_addrs( resolv, host )
addrs = resolv.getaddresses( host )
if ( addrs.size > 0 )
puts resolv.class.to_s.sub( /Resolv::/, '' )
addrs.each { |addr|
puts addr
}
end
return addrs.size
end
def output_names( ipaddr )
if ( ipaddr.class == IPAddr and
names = Resolv.getnames( ipaddr.to_s ) and
names.size > 0 )
names.each { |name|
puts name
}
end
return names.size
end
if ( $0 == __FILE__ )
main()
end
試しに getaddresses.rb という名前にしてみる。
$ ./getaddresses.rb aligach.net
Hosts
127.0.0.1
DNS
202.181.99.90
$ ./getaddresses.rb www.google.com
DNS
66.249.89.99
66.249.89.104
66.249.89.147
意外に便利。
取得したアドレスの数を返すので DNS にも hosts にも一切情報がない場合は 0 になり、失敗した旨を伝えることになります。
[2007-10-09 追記] 逆引きもできるようにしてみた。名前は pseudohost.rb とかそんなんで。
逆引きもできるので、通常の使い方では alias で host にしちゃうことも可能になった。これでより使いやすくなった。
※ ただし面倒なので逆引きの方は hosts だ DNS だなんつーことは言いません。