2008-08-06 6 views
16

が適切にインベントリされていないコンピュータがたくさんある環境にいます。基本的には、どのIPがどのMACアドレスに対応しているのか誰も知りません。 macアドレスとどのホスト名。だから私は次のように書いた:RubyでDNSを逆転する?

# This script goes down the entire IP range and attempts to 
# retrieve the Hostname and mac address and outputs them 
# into a file. Yay! 

require "socket" 

TwoOctets = "10.26" 

def computer_exists?(computerip) 
system("ping -c 1 -W 1 #{computerip}") 
end 

def append_to_file(line) 
file = File.open("output.txt", "a") 
file.puts(line) 
file.close 
end 


def getInfo(current_ip) 
begin 
    if computer_exists?(current_ip) 
    arp_output = `arp -v #{current_ip}` 
    mac_addr = arp_output.to_s.match(/..:..:..:..:..:../) 
    host_name = Socket.gethostbyname(current_ip) 
    append_to_file("#{host_name[0]} - #{current_ip} - #{mac_addr}\n") 
    end 
rescue SocketError => mySocketError 
    append_to_file("unknown - #{current_ip} - #{mac_addr}") 
end 
end 


(6..8).each do |i| 
case i 
    when 6 
    for j in (1..190) 
     current_ip = "#{TwoOctets}.#{i}.#{j}" 
     getInfo(current_ip) 
    end 
    when 7 
    for j in (1..255) 
     current_ip = "#{TwoOctets}.#{i}.#{j}" 
     getInfo(current_ip) 
    end 
    when 8 
    for j in (1..52) 
     current_ip = "#{TwoOctets}.#{i}.#{j}" 
     getInfo(current_ip) 
    end 
end 
end 

逆のDNSが見つからない以外はすべて動作します。私は取得しています

サンプル出力は次のとおりです。

10.26.6.12 - 10.26.6.12 - 00:11:11:9B:13:9F 
10.26.6.17 - 10.26.6.17 - 08:00:69:9A:97:C3 
10.26.6.18 - 10.26.6.18 - 08:00:69:93:2C:E2 

私はnslookup 10.26.6.12を行う場合、私は私のマシンは、DNSサーバーを見ていることを示し、正しいリバースDNSので を取得します。

私はSocket.gethostbyname,gethostbyaddrを試しましたが、動作しません。

ご指摘いただければ幸いです。

答えて

8

getaddrinfoをチェックアウトします。

host_name = Socket.gethostbyname(current_ip) 

:あなたが行を交換する場合

host_name = Socket.getaddrinfo(current_ip, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)[0][1] 

getaddrinfo関数は、配列の配列を返します。また、作品

Ruby Socket Docs

+0

実際、これは逆引きを行っていません。 7番目のパラメータを 'true'にする必要があります:' Socket.getaddrinfo(interesting_ip、0、Socket :: AF_UNSPEC、Socket :: SOCK_STREAM、nil、Socket :: AI_CANONNAME、true) ' – akostadinov

2

この:

host_name = Socket.getaddrinfo(current_ip,nil) 
append_to_file("#{host_name[0][2]} - #{current_ip} - #{mac_addr}\n") 

私はgethostbyaddrも機能しなかった理由はわからないあなたはでそれについての詳細を読むことができます。

24

今日、私はまた、DNSの逆引きを必要と私は非常に単純な標準溶液を見つけた:それはラフの場合に役立ちますタイムアウトを使用しているようだ

require 'resolv' 
host_name = Resolv.getname(ip_address_here)