代码之家  ›  专栏  ›  技术社区  ›  popopome

在Ruby中反向DNS?

  •  18
  • popopome  · 技术社区  · 17 年前

    我的环境里有很多电脑 正确清点。基本上,没有人知道哪个IP与哪个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.gethostbyname , gethostbyaddr 但不起作用。

    任何指导都将不胜感激。

    3 回复  |  直到 12 年前
        1
  •  8
  •   the Tin Man    12 年前

    我要结账离开 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]
    

    这个 获取信息 函数返回数组数组。您可以在以下网址了解更多信息:

    Ruby Socket Docs

        2
  •  24
  •   gertas    14 年前

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

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

    它似乎使用超时,这有助于在艰难的情况下。

        3
  •  2
  •   the Tin Man    12 年前

    这也适用于:

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

    我不知道为什么 gethostbyaddr 也没用。

    推荐文章