Question

Je suis dans un environnement avec beaucoup d'ordinateurs qui n'ont pas été correctement inventoriés.Fondamentalement, personne ne sait quelle IP va avec quelle adresse mac et quel nom d'hôte.J'ai donc écrit ce qui suit :

# 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

Tout fonctionne sauf qu'il ne trouve pas de DNS inversé.

L'exemple de sortie que j'obtiens est le suivant :

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 je fais nslookup 10.26.6.12 puis j'obtiens le DNS inverse correct donc qui montre que ma machine voit le serveur DNS.

j'ai essayé Socket.gethostbyname, gethostbyaddr, mais ça ne marche pas.

Tout conseil sera très apprécié.

Était-ce utile?

La solution

je vérifierais getaddrinfo.Si vous remplacez la ligne :

host_name = Socket.gethostbyname(current_ip)

avec:

host_name = Socket.getaddrinfo(current_ip, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)[0][1]

Le getaddrinfo la fonction renvoie un tableau de tableaux.Vous pouvez en savoir plus à ce sujet sur :

Documentation sur Ruby Socket

Autres conseils

Aujourd'hui, j'avais également besoin d'une recherche DNS inversée et j'ai trouvé une solution standard très simple :

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

Il semble qu'il utilise un délai d'attente, ce qui est utile dans les cas difficiles.

Cela fonctionne également :

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

Je ne sais pas pourquoi gethostbyaddr n'a pas non plus fonctionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top