Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

LAN内の全てのホストのIPアドレスとMacアドレスを取得する(Windows版)

仕事では、Windowsを使っているので、「橋本商会 » LAN内の全てのホストのIPアドレスとMacアドレスを取得する」をWindowsでも動くようにしました。
変更したのは、

  • pingのオプションの変更
  • arpのオプションの変更
  • Macアドレスの区切りを':'から'-'に変更

です。

macaddrs.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'parallel'

ARGV.each do |arg|
  unless arg =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
    STDERR.puts %Q{invalid addr "#{arg}"}
    exit 1
  end
end

first = ARGV.shift || '192.168.0.1'
last  = ARGV.shift || first.gsub(/\d+$/, '254')
puts "check #{first} ~ #{last}"

addrs = []
first.scan(/\d+$/)[0].to_i.upto(254) do |i|
  addr = first.gsub(/\d+$/, i.to_s)
  addrs << addr
  break if addr == last
end

mac_addr_pat = /[a-z\d]{1,2}(?:\-|:)[a-z\d]{1,2}(?:\-|:)[a-z\d]{1,2}(?:\-|:)[a-z\d]{1,2}(?:\-|:)[a-z\d]{1,2}(?:\-|:)[a-z\d]{1,2}/

results = Parallel.map(addrs, :in_threads => 128){|addr|
  if RUBY_PLATFORM =~ /mswin(?!ce)|mingw|cygwin|bccwin/
    `ping -n 1 #{addr}`           
    `arp -a #{addr}`.strip
  else
    `ping -c 1 #{addr}`
    `arp -n #{addr}`.strip
  end
}.select{|i|
  i =~ mac_addr_pat
}.map{|i|
  {
    :mac => i.scan(mac_addr_pat)[0],
    :ip => RUBY_PLATFORM =~ /mswin(?!ce)|mingw|cygwin|bccwin/ ?
    i.scan(/\d+\.\d+\.\d+.\d+/)[1] : i.scan(/\d+\.\d+\.\d+.\d+/)[0]
  }
}

puts "-"*2
results.each do |res|
  puts "#{res[:ip]}\t#{res[:mac]}"
end

参考

Windows環境を識別するところは、以下を参考にしました。