ruby sockets dns nslookup

¿Invertir DNS en Ruby?



sockets nslookup (3)

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

He intentado con Socket.gethostbyname , gethostbyaddr , pero no funciona.

Cualquier orientación será muy apreciada.


Hoy también necesitaba búsquedas DNS inversas y encontré una solución estándar muy simple:

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

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


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é gethostbyaddr tampoco funcionó.


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

Ruby Socket Docs