DNS reverso em Ruby?

votos
17

Eu estou em um ambiente com uma grande quantidade de computadores que não foram devidamente inventariados. Basicamente, ninguém sabe qual IP vai com qual endereço MAC e que hostname. Então eu escrevi o seguinte:

# 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

Tudo funciona, exceto que ele não encontrar um DNS reverso.

Exemplo de saída que eu estou recebendo é esta:

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

Se eu fizer nslookup 10.26.6.12, então eu obter o DNS reverso correta para que mostra que a minha máquina está vendo o servidor DNS.

Eu tentei Socket.gethostbyname, gethostbyaddrmas ele não funciona.

Qualquer orientação será muito apreciado.

Publicado 06/08/2008 em 02:07
fonte usuário
Em outras línguas...                            


3 respostas

votos
24

Hoje eu também precisava de pesquisa de DNS inversa e eu encontrei solução padrão muito simples:

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

Parece que ele usa tempo limite que ajuda em casos difíceis.

Respondeu 04/04/2011 em 22:52
fonte usuário

votos
8

GOSTARIA check-out getaddrinfo. Se você substituir a linha:

host_name = Socket.gethostbyname(current_ip)

com:

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

A getaddrinfofunção devolve uma matriz de matrizes. Você pode ler mais sobre ele em:

Rubi soquete Docs

Respondeu 06/08/2008 em 02:56
fonte usuário

votos
2

Isso também funciona:

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

Eu não sei por que gethostbyaddrnão também funcionam.

Respondeu 06/08/2008 em 13:04
fonte usuário

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