sockets - DNS inversé en Ruby?

Translate

Je suis dans un environnement avec de nombreux ordinateurs qui n'ont pas été correctement inventoriés. En gros, personne ne sait quelle adresse IP correspond à 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é.

Voici l'exemple de sortie que j'obtiens:

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 faisnslookup 10.26.6.12alors j'obtiens le DNS inversé correct, ce qui montre que ma machine voit le serveur DNS.

j'ai essayéSocket.gethostbyname, gethostbyaddr, mais cela ne fonctionne pas.

Toute orientation sera très appréciée.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je vérifieraisgetaddrinfo. 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]

legetaddrinfoLa fonction renvoie un tableau de tableaux. Vous pouvez en savoir plus sur:

Documents sur Ruby Socket

La source
Translate

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 le délai d'expiration, ce qui aide dans les cas difficiles.

La source
Translate

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 pourquoigethostbyaddrn'a pas fonctionné aussi.

La source