2008-08-06 45 views
16

Tôi đang ở trong một môi trường có nhiều máy tính chưa được kiểm kê đúng cách . Về cơ bản, không ai biết IP nào đi kèm với địa chỉ mac và tên máy chủ nào. Vì vậy, tôi đã viết như sau:Đảo ngược DNS trong Ruby?

# 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 

Mọi thứ hoạt động ngoại trừ nó không tìm thấy DNS đảo ngược.

Mẫu đầu ra mà tôi nhận được là:

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 

Nếu tôi làm nslookup 10.26.6.12 sau đó tôi nhận được DNS ngược chính xác để cho thấy rằng máy tính của tôi đang chứng kiến ​​các máy chủ DNS.

Tôi đã thử Socket.gethostbyname, gethostbyaddr, nhưng nó không hoạt động.

Mọi hướng dẫn sẽ được đánh giá cao.

Trả lời

8

Tôi sẽ xem getaddrinfo. Nếu bạn thay thế dòng:

host_name = Socket.gethostbyname(current_ip) 

với:

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

Chức năng getaddrinfo trả về một mảng của mảng. Bạn có thể đọc thêm về nó tại địa chỉ:

Ruby Socket Docs

+0

Trong thực tế, điều này không làm tra cứu ngược lại. Bạn cần phải thực hiện tham số thứ 7 'true':' Socket.getaddrinfo (thú_chọn, 0, Socket :: AF_UNSPEC, Socket :: SOCK_STREAM, nil, Socket :: AI_CANONNAME, true) ' – akostadinov

2

này cũng hoạt động:

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

Tôi không chắc chắn lý do tại sao gethostbyaddr không còn làm việc.

24

Hôm nay tôi cũng cần tra cứu DNS ngược và tôi đã tìm thấy giải pháp tiêu chuẩn rất đơn giản:

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

Có vẻ như nó sử dụng thời gian chờ giúp trong những trường hợp khó khăn.