Reverzní DNS v Ruby?

hlasů
17

Jsem v prostředí s množstvím počítačů, které nebyly řádně inventur. V podstatě nikdo neví, jakou IP jde se kterým mac adresu a který hostname. Tak jsem napsal následující:

# 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

Všechno funguje kromě ní nenajde reverzní DNS.

Ukázkový výstup, který jsem stále je toto:

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

Pokud se mi nslookup 10.26.6.12pak jsem se dostat správné reverzní DNS tak, že ukazuje, že můj stroj je vidět DNS server.

Snažil jsem se Socket.gethostbyname, gethostbyaddrale to nefunguje.

Jakékoli pokyny budou ceněn.

Položena 06/08/2008 v 02:07
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
24

Dnes jsem také zapotřebí zpětné vyhledávání DNS a já jsem zjistil, velmi jednoduchý standardní řešení:

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

Zdá se, že používá časový limit, který pomáhá při drsné případy.

Odpovězeno 04/04/2011 v 22:52
zdroj uživatelem

hlasů
8

Chtěl bych vyzkoušet getaddrinfo. Pokud nahradíte řádek:

host_name = Socket.gethostbyname(current_ip)

s:

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

getaddrinfoFunkce vrací pole pole. Můžete si přečíst více o tom na adrese:

Ruby Socket Docs

Odpovězeno 06/08/2008 v 02:56
zdroj uživatelem

hlasů
2

To také funguje:

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

Nejsem si jistý, proč gethostbyaddrnebylo také pracovat.

Odpovězeno 06/08/2008 v 13:04
zdroj uživatelem

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