Aquí podría ser tu PUBLICIDAD


¿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 garg
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 10:52
fuente por usuario gertas


Aquí podría ser tu PUBLICIDAD


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 NilObject

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 01:04
fuente por usuario garg