¿Invertir DNS en Ruby?

votos
17

Estoy en un entorno con muchas computadoras que no se han inventariado correctamente. Básicamente, nadie sabe qué IP va con qué dirección MAC y qué nombre de host. Entonces escribí lo siguiente:

# 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

Todo funciona, excepto que no encuentra un DNS inverso.

La salida de muestra que obtengo es esta:

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 lo hago nslookup 10.26.6.12, obtengo el DNS inverso correcto para que se muestre que mi máquina está viendo el servidor DNS.

Lo he intentado Socket.gethostbyname, gethostbyaddrpero no funciona.

Cualquier orientación será muy apreciada.

Publicado el 06/08/2008 a las 02:07
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
24

Hoy también necesitaba búsqueda DNS inversa y he encontrado la solución estándar muy simple:

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

Parece que utiliza el tiempo de espera que ayuda en casos difíciles.

Respondida el 04/04/2011 a las 22:52
fuente por usuario

votos
8

Yo echaría un vistazo getaddrinfo. Si reemplazas la línea:

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 getaddrinfofunción devuelve una matriz de matrices. Puedes leer más sobre esto en:

Ruby Socket Docs

Respondida el 06/08/2008 a las 02:56
fuente por usuario

votos
2

Esto también funciona:

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

No estoy seguro de por qué gethostbyaddrno funcionó.

Respondida el 06/08/2008 a las 13:04
fuente por usuario

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