Pregunta

Estoy en un entorno con muchas computadoras que no han sido inventoradas 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.

El resultado de muestra que obtengo es este:

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 Luego obtengo el DNS inverso correcto para que eso demuestre que mi máquina está viendo el servidor DNS.

Yo he tratado Socket.gethostbyname, gethostbyaddr, pero no funciona.

Cualquier orientación será muy apreciada.

¿Fue útil?

Solución

yo comprobaría getaddrinfo.Si reemplaza 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]

El getaddrinfo La función devuelve una matriz de matrices.Puedes leer más al respecto en:

Documentos de Ruby Socket

Otros consejos

Hoy también necesitaba una búsqueda inversa de DNS y encontré una solución estándar muy simple:

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

Parece que utiliza un 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ó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top