在Ruby中反向DNS?

我的环境中有很多没有正确清点的计算机。 基本上,没有人知道哪个IP与哪个mac地址和哪个主机名相关。 所以我写了以下内容:

# 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 

除了没有找到反向DNS之外,一切正常。

我得到的示例输出是这样的:

 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 

如果我执行nslookup 10.26.6.12然后我得到正确的反向DNS,这表明我的机器正在看到DNS服务器。

我尝试过Socket.gethostbynamegethostbyaddr ,但它不起作用。

任何指导将不胜感激。

我会看看getaddrinfo 。 如果你更换线:

 host_name = Socket.gethostbyname(current_ip) 

有:

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

getaddrinfo函数返回一个数组数组。 您可以在以下位置了解更多信息:

Ruby Socket文档

今天我还需要反向DNS查找,我发现了非常简单的标准解决方案:

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

它似乎使用超时,这有助于粗略的情况。

这也有效:

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

我不确定为什么gethostbyaddr也不起作用。