DNS inversé dans Ruby?
Question
Je suis dans un environnement avec beaucoup d'ordinateurs qui n'ont pas été correctement inventoriés.Fondamentalement, personne ne sait quelle IP va avec quelle adresse mac et quel 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 de DNS inversé.
L'exemple de sortie que j'obtiens est le suivant :
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 j'obtiens le DNS inverse correct donc
qui montre que ma machine voit le serveur DNS.
j'ai essayé Socket.gethostbyname
, gethostbyaddr
, mais ça ne marche pas.
Tout conseil sera très apprécié.
La solution
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]
Le getaddrinfo
la fonction renvoie un tableau de tableaux.Vous pouvez en savoir plus à ce sujet sur :
Autres conseils
Aujourd'hui, j'avais également besoin d'une recherche DNS inversée et j'ai trouvé une solution standard très simple :
require 'resolv'
host_name = Resolv.getname(ip_address_here)
Il semble qu'il utilise un délai d'attente, ce qui est utile dans les cas difficiles.
Cela fonctionne également :
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 non plus fonctionné.