2008-08-06 34 views
16

Je suis dans un environnement avec beaucoup d'ordinateurs qui n'ont pas été correctement inventoriés. Fondamentalement, personne ne sait quelle adresse IP va avec quelle adresse mac et quel nom d'hôte. Donc, j'ai écrit ce qui suit:Inverser DNS dans 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 

Tout fonctionne sauf qu'il ne trouve pas de DNS inverse.

Exemple de sortie que je reçois est la suivante:

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 

Si je fais nslookup 10.26.6.12 puis-je obtenir le DNS inverse correct si qui montre que ma machine est de voir le serveur DNS. J'ai essayé Socket.gethostbyname, gethostbyaddr, mais cela ne fonctionne pas.

Tout guidage sera très apprécié.

Répondre

8

Je voudrais vérifier getaddrinfo. Si vous remplacez la ligne:

host_name = Socket.gethostbyname(current_ip) 

avec:

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

La fonction retourne getaddrinfo un tableau de tableaux. Vous pouvez en lire davantage à:

Ruby Socket Docs

+0

En fait, cela ne fait pas de recherche inversée. Vous devez faire le 7ème paramètre 'true':' Socket.getaddrinfo (code_intéressant, 0, Socket :: AF_UNSPEC, Socket :: SOCK_STREAM, nil, Socket :: AI_CANONNAME, true) ' – akostadinov

2

Cela fonctionne aussi:

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

Je ne sais pas pourquoi gethostbyaddr n'a pas fonctionné aussi.

24

Aujourd'hui, j'ai aussi besoin d'une recherche DNS inversée et je l'ai trouvé solution standard très simple:

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

Il semble qu'il utilise délai d'attente qui aide dans les cas difficiles.