Reverse DNS în Ruby?

voturi
17

Sunt într-un mediu cu o mulțime de calculatoare care nu au fost inventariate în mod corespunzător. Practic, nimeni nu știe ce adresă IP merge cu care adresa MAC și care numele 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.

Exemplu de rezultat că eu sunt obtinerea este aceasta:

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ă o fac , nslookup 10.26.6.12atunci am obține DNS inversă corectă , astfel încât arată că mașina mea este de a vedea serverul DNS.

Am încercat Socket.gethostbyname, gethostbyaddrdar aceasta nu funcționează.

Orice orientare va fi mult mai apreciat.

Întrebat 06/08/2008 la 02:07
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
24

Azi am nevoie, de asemenea, de căutare DNS inversă și l-am găsit soluția standard foarte simplu:

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

Se pare că folosește timeout care ajută în cazuri aspre.

Publicat 04/04/2011 la 22:52
sursa de către utilizator

voturi
8

Mi - ar verifica afară 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]

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

Ruby Socket Documente

Publicat 06/08/2008 la 02:56
sursa de către utilizator

voturi
2

Acest lucru funcționează, de asemenea:

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

Nu sunt sigur de ce gethostbyaddrnu a funcționat , de asemenea.

Publicat 06/08/2008 la 13:04
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more