Reverse DNS in Ruby?

voti
17

Sono in un ambiente con un sacco di computer che non sono stati adeguatamente inventariati. In sostanza, non si sa che va IP con cui indirizzo MAC e che hostname. 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

Tutto funziona tranne che non trova un DNS inverso.

Esempio di output che sto ricevendo è 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 lo faccio nslookup 10.26.6.12allora ottengo il corretto reverse DNS in modo che dimostra che la mia macchina è vedere il server DNS.

Ho provato Socket.gethostbyname, gethostbyaddrma non funziona.

Qualsiasi orientamento sarà molto apprezzato.

È pubblicato 06/08/2008 alle 00:07
fonte dall'utente
In altre lingue...                            


3 risposte

voti
8

Vorrei verificare out getaddrinfo. Se si sostituisce la linea:

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]

La getaddrinfofunzione restituisce un array di array. Si può leggere di più riguardo a:

Rubino Socket Docs

Risposto il 06/08/2008 a 00:56
fonte dall'utente

voti
2

Questo funziona anche:

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

Io non sono sicuro perché gethostbyaddrnon ha funzionato anche.

Risposto il 06/08/2008 a 11:04
fonte dall'utente

voti
24

Anche oggi avevo bisogno di ricerca DNS inversa e ho trovato molto semplice soluzione standard:

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

Sembra che utilizza timeout che aiuta nei casi di massima.

Risposto il 04/04/2011 a 20:52
fonte dall'utente

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