Решая задачку раздачи инета на второй комп, наткнулся на необходимость получения IP адреса по MAC. Сначала использовал какой-то скрипт на вижуалбейсике, но при даунгрейде Windows XP до Windows 2000 способ отвалился. Тогда я плюнул на тот скрипт и пару bat-ников обвязки и соединил всё в скрипт на Ruby

Собственно имеем:

  1. Комп с линухом и сквидом, раздающий инет. Внутренний IP — динамический
  2. Комп с Windows, на котором нужен инет. IP — динамический, подсеть та же
  3. Нежелание свзяваться с роутером, чтобы избавиться от этого безобразия =)

Наш алгоритм

  1. Пингуем всю подсеть (да, в винде пинг не умеет броадкасты)
  2. Ищем нужный мак в кэше
  3. Пишем в хостс нужный адрес

Сам код:

  1. require ‘fileutils’
  2.  
  3. # мак-адрес жертвы. в windows через чёрточки, в linux через двоеточия
  4. mac  = ’00-12-34-56-78-9a’
  5. # имя хоста для нашего адреса
  6. host = ‘proxy’
  7. # файл hosts, у нас Windows 2000, напоминаю
  8. hosts_file = ‘c:/winnt/system32/drivers/etc/hosts’
  9.  
  10. # задаём диапазон айпишников. мне так было удобнее =)
  11. class_a = (127..127)
  12. class_b = (0..0)
  13. class_c = (0..255)
  14. class_d = (1..254)
  15.  
  16. # запускаем наши пинги
  17. puts ‘Running pings…’
  18. class_a.each do |a|
  19.   class_b.each do |b|
  20.     class_c.each do |c|
  21.       class_d.each do |d|
  22.         cmd = "start /b ping #{a}.#{b}.#{c}.#{d} -n 1 > nul"
  23.           # раз у нас не работают всякие форки и бэкграунды,
  24.           # используем для этих целей утилиту start
  25.         system(cmd)
  26.         print ‘.’ # чтобы юзер не скучал
  27.       end
  28.     end
  29.   end
  30. end
  31. print "\n"
  32.  
  33. puts ‘Waiting for pings to finish…’
  34. sleep(5) # ждём. на самом деле можно меньше
  35.  
  36. puts ‘Checking arp cache for MAC…’ # теперь все жвые компы должны осесть в кэше arp
  37. arp_cache = `arp -a`
  38. ip = nil
  39. arp_cache.split("\n").each do |s|
  40.   if(s[mac])
  41.     ip = s.split[0]
  42.   end
  43. end
  44.  
  45. if(ip == nil) # не нашли. облом
  46.   puts ‘Error: IP address not found’
  47.   STDIN.getc
  48.   quit
  49. end
  50.  
  51. puts "IP is #{ip}. Setting hosts file…" # пишем наш результат в хостс
  52. tmp_file = hosts_file + ".tmp"
  53. tf = File.new(tmp_file, "w")
  54. hf = File.new(hosts_file, "r")
  55.  
  56. append = 1
  57. hf.readlines.each do |line|
  58.   if line[host]
  59.     append = 0
  60.     tf.puts("#{ip}\t#{host}")
  61.   else
  62.     tf.puts(line)
  63.   end
  64. end
  65.  
  66. if(append == 1)
  67.   tf.puts("#{ip}\t#{host}")
  68. end
  69.  
  70. hf.close
  71. tf.close
  72.  
  73. FileUtils.rm(hosts_file)
  74. FileUtils.mv(tmp_file,hosts_file)

файлом

К сожалению, работает далеко не мгновенно, а так уже недели две стоит на моём втором компе и не вызывает нареканий.

P.S. Подскажите если кто знает как в вордпрессе нормально код выкладывать? Это ж ужосужос, замучился пока форматировал Code Highlighter