поиск ipv6-адреса для MAC-адреса у соседей

У меня есть список возможных IP-адресов, преобразованных MAC-адресами, которые можно найти в

ping6 ff02::1%wlan0 

возможными адресами mac являются, например:

 66:70:02:75:80:fe, 64:70:02:74:80:fe, 66:70:02:74:80:ff 

каждый из них приведет к локальному адресу ip6, начинающемуся с fe80:: и вставленному FF:FE в середине

поэтому 66:70:02:75:80:fe приведет к fe80::6670:2ff:fe75:80fe

Я хотел бы создать скрипт, который выдает соответствующий адрес LinkLocal для списка MAC-адресов:

 $ find-in-macs 66:70:02:75:80:fe 64:70:02:74:80:fe 66:70:02:74:80:ff 

и выход:

 matching IP6: fe80::6670:2ff:fe75:80fe 

этот скрипт find-in-macs может выглядеть так:

 #!/bin/bash mac_to_ipv6 () { IFS=':'; set $1; unset IFS ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" echo $ipv6_address } for i do echo checking $i ping6 ff02::1%wlan0|grep mac_to_ipv6 $i done 

2 Solutions collect form web for “поиск ipv6-адреса для MAC-адреса у соседей”

Во-первых, вам не только нужно разделить MAC и вставить ff: fe, вам также нужно перевернуть 7-й бит, чтобы правильно представлять универсальный / локальный адрес.

Этот скрипт будет правильно форматировать локальный адрес IPv6 на основе простого эфирного адреса, включая сокращение ведущих нулей.

 #!/bin/bash IFS=':'; set $1; unset IFS printf "fe80::%x:%x:%x:%x\n" $(( 0x${1}${2} ^ 0x200 )) 0x${3}ff 0xfe${4} 0x${5}${6} 

Пример бит-листания и нулевого уменьшения:

 $ ether_to_ipv6 00:00:00:00:00:00 fe80::200:ff:fe00:0 $ ether_to_ipv6 11:11:11:11:11:11 fe80::1311:11ff:fe11:1111 

Также имейте в виду, что технически не гарантировано, что ссылка будет иметь адрес, соответствующий этому алгоритму. Если есть столкновение (злонамеренное или иное), новый адрес должен быть выбран одним или обоими. Реализации могут вести себя по-разному относительно того, как это фактически обрабатывается, поэтому YMMV.

Однако, если все, что вы действительно пытаетесь сделать, это получить список ваших реальных соседей (аналогично arp в IPv4), тогда есть более простой способ. Используйте протокол обнаружения соседей (ndp).

Linux:

 ip -6 neigh show 

Solaris:

 netstat -pf inet6 

Mac OS X, AIX, * BSD:

 ndp -a 

JunOS, IOS, Vyatta:

 show ipv6 neighbors 

Каждая из этих команд покажет список всех живущих соседей IPv6, используя собственный ndp.

С вашими советами я могу закончить скрипт:

 #!/bin/bash mac_to_ipv6 () { IFS=':'; set $1; unset IFS ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" echo $ipv6_address } echo "Next MAC with ^C" for i do echo echo checking for $i = $(mac_to_ipv6 $i) echo ping6 ff02::1%wlan0 | head -n 1000 | grep $(mac_to_ipv6 $i) done 

см .: http://freifunk.in-kiel.de/wiki/Firmware#IPv6_Adresse_des_Routers

  • Bash конвертирует имена путей для sed, чтобы они избегали
  • В чем разница между «du -sh *» и «du -sh ./*»?
  • ожидание сети в сценарии bash
  • не удается удалить файл с возвратом каретки
  • IF для возврата true, если слово содержит конкретное письмо
  • Как использовать kdialog progressbar из сценария Bash, когда панель была инициализирована в другом скрипте?
  • Настроить bash для выполнения команды с последним аргументом, если аргумент не был предоставлен
  • Как grep файл для отметки времени? Я ищу цифры часа
  • В bash, grep для строки, начинающейся с \, и присваивания результата с помощью обратных шагов
  • Извлечение строки в соответствии с шаблоном в сценарии bash
  • Задания подобны командам с статусом выхода, за исключением случаев, когда есть замена команды?
  • Linux и Unix - лучшая ОС в мире.