DNS inverse en Ruby?

voix
17

Je suis dans un environnement avec un grand nombre d'ordinateurs qui ne sont pas correctement inventoriés. Au fond, personne ne sait qui va de pair avec IP qui adresse MAC et le nom d'hôte. J'ai donc écrit ce qui suit:

# 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 un Reverse DNS.

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.12alors je reçois le DNS inverse correct pour que montre que ma machine est de voir le serveur DNS.

Je l' ai essayé Socket.gethostbyname, gethostbyaddrmais ça ne fonctionne pas.

Toute orientation sera très appréciée.

Créé 06/08/2008 à 02:07
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
24

Aujourd'hui, je devais aussi la recherche DNS inversée et j'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.

Créé 04/04/2011 à 22:52
source utilisateur

voix
8

Je vérifierais 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 getaddrinfofonction retourne un tableau de tableaux. Vous pouvez en lire davantage à:

Ruby Socket Docs

Créé 06/08/2008 à 02:56
source utilisateur

voix
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 gethostbyaddrne fonctionne pas aussi.

Créé 06/08/2008 à 13:04
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more