sockets - DNS in Ruby umkehren?

Translate

Ich bin in einer Umgebung mit vielen Computern, die nicht richtig inventarisiert wurden. Grundsätzlich weiß niemand, welche IP zu welcher Mac-Adresse und welchem Hostnamen gehört. Also schrieb ich folgendes:

# 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

Alles funktioniert, außer dass kein Reverse DNS gefunden wird.

Die Beispielausgabe, die ich erhalte, lautet:

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

Wenn ich machenslookup 10.26.6.12Dann erhalte ich das richtige Reverse-DNS, sodass angezeigt wird, dass auf meinem Computer der DNS-Server angezeigt wird.

Ich habe versuchtSocket.gethostbyname, gethostbyaddr, aber es funktioniert nicht.

Jede Anleitung wird sehr geschätzt.

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

Alle Antworten

Translate

Ich würde auscheckengetaddrinfo. Wenn Sie die Leitung ersetzen:

host_name = Socket.gethostbyname(current_ip)

mit:

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

DasgetaddrinfoFunktion gibt ein Array von Arrays zurück. Sie können mehr darüber lesen unter:

Ruby Socket Docs

Quelle
Translate

Heute brauchte ich auch eine umgekehrte DNS-Suche und habe eine sehr einfache Standardlösung gefunden:

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

Es scheint, dass es Timeout verwendet, was in rauen Fällen hilft.

Quelle
Translate

Das funktioniert auch:

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

Ich bin mir nicht sicher warumgethostbyaddrhat auch nicht funktioniert.

Quelle