Vă mulțumim pentru susținere

Reverse DNS în Ruby?

Sunt într-un mediu cu multe computere care nu au fost corect inventariate. Practic, nimeni nu știe care IP merge cu care adresa mac și ce nume de gazdă. Așa că am scris următoarele:

# 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

Totul funcționează, cu excepția faptului că nu găsește un DNS Reverse.

Eșantionul de ieșire pe care îl primesc este următorul:

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

Dacă fac nslookup 10.26.6.12 atunci primesc DNS invers corect corect care arată că aparatul meu vede serverul DNS.

Am încercat Socket.gethostbyname , gethostbyaddr , dar nu funcționează.

Orice îndrumare va fi mult apreciată.

0
adăugat editat

3 răspunsuri

Acest lucru funcționează și:

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

Nu sunt sigur de ce gethostbyaddr nu a funcționat de asemenea.

0
adăugat

Aș verifica getaddrinfo . Dacă înlocuiți linia:

host_name = Socket.gethostbyname(current_ip)

cu:

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

Funcția getaddrinfo returnează o matrice de matrice. Puteți citi mai multe despre el la:

Documente Google Ruby Socket

0
adăugat
De fapt, acest lucru nu face căutarea inversă. Trebuie să faceți al șaptelea parametru true : Socket.getaddrinfo (interesant_ip, 0, Socket :: AF_UNSPEC, Socket :: SOCK_STREAM, null, Socket :: AI_CANONNAME, true)
adăugat autor akostadinov

Astăzi am avut nevoie de o căutare inversă DNS și am găsit soluția standard foarte simplă:

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

Se pare că folosește timpul de expirare care ajută în cazuri grave.

0
adăugat