2008-08-06 15 views
16

Ich bin in einer Umgebung mit vielen Computern, die nicht ordnungsgemäß inventarisiert wurden. Grundsätzlich weiß niemand, welche IP mit welcher MAC Adresse und welchem ​​Hostnamen geht. So schrieb ich folgendes:Reverse DNS in Ruby?

# 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 

Alles funktioniert, außer es findet kein Reverse DNS.

Beispiel für eine Ausgabe, die ich erhalte, ist dies:

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 

Wenn ich nslookup 10.26.6.12 dann ich den richtigen Reverse-DNS so erhalten, die zeigt, dass meine Maschine den DNS-Server ist zu sehen.

Ich habe versucht Socket.gethostbyname, gethostbyaddr, aber es funktioniert nicht.

Jede Anleitung wird sehr geschätzt.

Antwort

8

Ich würde überprüfen, getaddrinfo. Wenn Sie die Zeile:

host_name = Socket.gethostbyname(current_ip) 

mit:

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

Die getaddrinfo Funktion gibt ein Array von Arrays. Sie können mehr darüber lesen:

Ruby Socket Docs

+0

In der Tat tut dies nicht Reverse-Lookup. Sie müssen den 7. Parameter 'true' machen:' Socket.getaddrinfo (interesting_ip, 0, Socket :: AF_UNSPEC, Socket :: SOCK_STREAM, nil, Socket :: AI_CANONNAME, true) ' – akostadinov

2

Dies funktioniert auch:

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

Ich bin nicht sicher, warum gethostbyaddr arbeiten nicht auch haben.

24

Heute habe ich auch Reverse-DNS-Lookup und ich habe festgestellt, sehr einfache Standardlösung benötigt:

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

Es es Timeout, die in groben Fällen helfen scheint verwendet.