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ă.
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:
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.