Reverse DNS in Ruby?
Domanda
Io sono in un ambiente con un sacco di computer che non sono stati correttamente inventariati.Fondamentalmente, non si sa quale IP va con il quale l'indirizzo mac e il nome dell'host.Così ho scritto il seguente:
# 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
Funziona tutto tranne che non trova il DNS Inverso.
Esempio di output che ricevo è questo:
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
Se faccio nslookup 10.26.6.12
poi ho corretto il reverse DNS, in modo
che dimostra che la mia macchina è vedere il server DNS.
Ho provato Socket.gethostbyname
, gethostbyaddr
, ma non funziona.
Ogni guida sarà molto apprezzato.
Soluzione
Io il check-out getaddrinfo
.Se si sostituisce la riga:
host_name = Socket.gethostbyname(current_ip)
con:
host_name = Socket.getaddrinfo(current_ip, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)[0][1]
Il getaddrinfo
la funzione restituisce un array di array.Si può leggere di più su di esso a:
Altri suggerimenti
Oggi ho anche bisogno di reverse DNS lookup e l'ho trovato molto semplice soluzione standard:
require 'resolv'
host_name = Resolv.getname(ip_address_here)
Sembra che usi di timeout che aiuta in condizioni di casi.
Questo funziona anche:
host_name = Socket.getaddrinfo(current_ip,nil)
append_to_file("#{host_name[0][2]} - #{current_ip} - #{mac_addr}\n")
Non so perché gethostbyaddr
non lavoro.