如何使用Ruby获取Windows网络中的计算机名称列表

时间:2012-03-31 22:30:59

标签: ruby windows lan

我知道Ruby有很多宝石,允许程序员编写一个非常美丽的代码。 默认情况下,此简短示例扫描子网192.168.1.x上的所有地址。

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

如何获取计算机名称而不是ip?有没有实现Window API(NetBIOS)的gem? 也许最好使用smth。像解析'ipconfig / all'的macaddr http://rubygems.org/gems/macaddr(在我的情况下 - 'nbtstat')

2 个答案:

答案 0 :(得分:2)

ipscanner gem看起来只是循环通过192.168.1。(1..254)并构建一个没有超出此行的ip地址数组:TCPSocket。new(ip_address) )

因此,一种方法可能是在给定IP地址的情况下反向查找主机名。看起来Socket class可以帮助您。

例如:

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')

代码取自blog

我在网络上没有任何计算机来测试这个,我对这些东西知之甚少,不知道IP上的计算机名称和IP上的主机名之间是否存在差异。如果上述方法不起作用,则不能太远。

答案 1 :(得分:1)

感谢@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"]