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