Получение IP по MAC

Mar 29, 2010 19:09


Решая задачку раздачи инета на второй комп, наткнулся на необходимость получения 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

Originally published at Chase Your Dreams!. You can comment here or there.

mac, windows, windows 2000, howtos, development, proxy, ruby, ip

Previous post Next post
Up