Chase Your Dreams!

Christian Archer

  • Home
  • Profile
  • Friends
  • Forums
  • Gallery
  • Homepage
  • Copyright
Twitter Facebook RSS

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

Posted on March 29, 2010 by SunChaser
No CommentsLeave a comment

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

  • Share this:
  • Email
  • ВКонтакте
Categories: Development, Howtos, Windows | Tags: ip, mac, proxy, ruby, windows 2000
Вмемориз!
Ричард III

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

*

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

  • Similar Posts

    • Я уже совсем потерян для общества?
    • Простые юниксовые решения
    • Rambler + XMPP
    • KDE 4 для Windows
    • Забавно
  • Blogroll

    • Блог android разработчика
  • FeedBurner

  • Calendar

    March 2010
    M T W T F S S
    « Feb   Apr »
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
  • Archives

  • Categories

    • ? (1)
    • Bookmarks (15)
    • Culture (186)
      • Books (10)
      • Comics (1)
      • Holidays (1)
      • Law (3)
      • Linguistics (13)
      • Movies and TV (45)
      • Music (25)
      • Nippon (47)
        • Anime (43)
      • Politics (25)
      • Quotes (20)
      • Religion (3)
      • Science (15)
      • Video (16)
    • Development (38)
      • Design (4)
      • Qt (4)
      • Ruby (1)
      • Web Development (19)
    • Fun (75)
    • IT (218)
      • Cross-site Connectivity (11)
        • oEmbed (2)
        • OpenID (9)
      • Games (15)
      • Howtos (11)
      • Instant Messaging (38)
        • Jabber (26)
      • Internet Misc (37)
      • Linux (46)
      • Multimedia (3)
      • Phones (1)
      • Windows (21)
        • Linux Software in Windows (4)
      • WordPress (13)
      • XML (4)
    • Miscellaneous (43)
    • Personal (95)
      • Blog Flashmob (2)
      • Random Thoughts (25)
      • Secret Wishes (3)
      • Travel (3)
    • Pictures (20)
      • Gallery Updates (10)
      • Photography (3)
  • Recent Comments

    • SunChaser on DNS Service
    • Johan on DNS Service
    • SunChaser on DNS Service
    • SunChaser on DNS Service
    • SunChaser on DNS Service
  • Forum Topics

    • Jabber Server
  • SunChaser on Twitter

    • RT @xenia_sobchak: Якеменко публичноотказал мне во вступлении в его партию.как жить дальше?есть ли смысл?обьявляюУстричную голодовку по ... 14 hours ago
    • @ilyabirmannet Most likely he uses some third party caching plugin 15 hours ago
    • RT @read_the_tweet: Вовочка очень хотел конфету, но отдал её Маше, потому что Машу он хотел больше. 17 hours ago
    • RT @KermlinRussia: Скоро начнут людей на улицах хватать и назначать полпредами. 3 days ago
    • @kwizme_en spare 3 days ago
© 2006-2012 by Christian Archer Proudly Powered by WordPress | Nest Theme by YChong
loading Cancel
Post was not sent - check your email addresses!
Email check failed, please try again
Sorry, your blog cannot share posts by email.