Как я могу получить список имен компьютеров в сети Windows, используя Ruby - PullRequest
1 голос
/ 01 апреля 2012

Я знаю, что в Ruby есть много гемов, позволяющих программистам писать действительно красивый код.Этот короткий пример по умолчанию сканирует все адреса в подсети 192.168.1.x.

require 'ipscanner'
a = IPScanner.scan
#=> ["192.168.1.1", "192.168.1.4"]

Как получить имена компьютеров вместо ip?Есть ли драгоценный камень, который реализует Window API (NetBIOS)?Может быть, лучше использовать что-л.как macaddr http://rubygems.org/gems/macaddr, который анализирует 'ipconfig / all' (в моем случае - 'nbtstat')

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

То, что ipscanner gem выглядит так, будто оно просто циклически перебирает 192.168.1. (1..254) и создает массив IP-адресов, для которых не истекло время ожидания этой строки: TCPSocket .new (ip_address)

Таким образом, один из методов может заключаться в обратном поиске имени хоста по IP-адресу. Похоже, класс Socket может вам помочь.

Например:

Socket.do_not_reverse_lookup = false
s = Socket.getaddrinfo(’66.249.67.49′,nil)
hostname = s[0][4]

или

host = Resolv.new.getname('66.249.67.49')

Код взят из блога .

У меня нет компьютеров в сети, чтобы проверить это, и я недостаточно знаю об этом, чтобы узнать, есть ли разница между именем компьютера по IP и именем хоста по IP. Если вышеперечисленное не работает, оно не может быть слишком далеко.

1 голос
/ 01 апреля 2012

Благодаря @ danneu.

Я написал простой пример, отлично работает на Windows 7. Проверьте политику брандмауэра (вы можете получить только ip вместо имени компьютера)!Имя компьютера является третьим параметром, поэтому используйте hostname = Socket.getaddrinfo ('192.168.1.10', nil) [0] [2].

require 'ipscanner'
Socket.do_not_reverse_lookup = false
IPScanner.scan.each { 
    |i|
    puts "#{Socket.getaddrinfo(i, nil)}"    
}

Вывод:

[["AF_INET", 0, "STARBOY", 192.168.1.2, 2, 0, 0]]
[["AF_INET", 0, 192.168.1.1, 192.168.1.1, 2, 0, 0]]
[["AF_INET", 0, "mcx-PC", 192.168.1.4, 2, 0, 0]]

Этот пример более нагляден и работает последовательно, ожидая завершения всех потоков.Тайм-аут Pingecho увеличен до 50 мс.

require 'ipscanner'

puts 'List of computers in your LAN. Please wait ...'

class IPScanner
    # override scan method
    def self.scan(ip_base = '192.168.1.', range = 1..254, t = 50)
        computers = [] 
        threads = []  
        Socket.do_not_reverse_lookup = false    
        (range).map { 
            |i| 
            threads << Thread.new {
                ip = ip_base + i.to_s
                if pingecho(ip, t) 
                    computers << Socket.getaddrinfo(ip, nil)[0][2]                    
                end
            }
        }.join      
        # wait for all threads to terminate
        threads.each { |thread| thread.join }
        return computers
    end
end

puts "#{IPScanner.scan}"

Выход:

["STARBOY", "192.168.1.1", "mcx-PC"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...