Подтвердить что ты не робот

Могу ли я определить текущий IP-адрес с известного MAC-адреса?

У меня есть оболочка script, которая использует etherwake для пробуждения машины в моей локальной сети. После того, как машина проснулась, я не уверен в IP-адресе.

Пытаясь ответить на мой собственный вопрос, я придумал:

ip=$(ping -c 1 hostname | head -1 | awk '{print $3}' | sed 's/[()]//g')

Это решение гласит, что я знаю имя хоста удаленной машины, что не так обременительно.

Есть ли способ получить IP-адрес, если все, что я знаю, это MAC-адрес?

4b9b3361

Ответ 1

Я не думаю, что для этого есть одна команда. Один взлом - это выполнить сканирование ping или широковещательный пинг в подсети, а затем запросить таблицу arp для IP-адреса MAC-адреса. Очевидно, это не идеальное решение. Пример:

nmap -sP 192.168.1.0/24 >/dev/null && arp -an | grep <mac address here> | awk '{print $2}' | sed 's/[()]//g'

Здесь nmap выполнит сканирование ping и заполнит ваш кеш arp. После завершения сканирования команда arp может использоваться для печати таблицы arp, а затем вы вытаскиваете IP-адрес с помощью grep/awk. Вы можете попробовать заменить nmap на широковещательный пинг, но это, вероятно, не так надежно.

Ответ 2

Я бы просто использовал

ip neighbor | grep "00:1E:C9:56:3C:8E" | cut -d" " -f1

Ответ 3

Другие способы, представленные здесь, были ненадежными, например. вывод ip neighbor не всегда содержал последнее состояние, поэтому я закончил повторное сканирование сети с помощью arp-scan, и, следовательно, я просто использовал вывод сканирования для получения IP-адреса для заданного MAC-адреса.

Для сканирования одного сетевого интерфейса просто используйте это:

arp-scan -q -l --interface en4 2>/dev/null | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1

Следующая команда сканирует сразу несколько сетевых интерфейсов:

{ arp-scan -q -l --interface en0 2>/dev/null & arp-scan -q -l --interface en4 2>/dev/null } | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1

Ответ 4

Вы можете попробовать команду arp и grep по адресу mac

arp -a | grep "00:00:00:00:00:00"

(замените свой собственный mac addr)

Ответ 5

Я написал модуль python, который может это сделать:

>>> from ethip import ethip
>>> print ethip.getip('00:1E:C9:56:3C:8E', '10.5.42.255')
10.5.42.3

Я просто делаю быстрые запросы arp, чтобы найти ip, а затем кэширует то, что он находит. Код находится в github.

Ответ 6

Ответ Нила требует слишком долгого времени. Мне приходилось работать с диапазоном IP-адресов 60k+. Трюк, чтобы сделать эту работу, - проверить таблицу arp после каждого пинга. Это также устраняет проблему с корнем: нет необходимости. Я сделал это на Java (см. threadedScan() здесь), потому что я был на окнах и нуждался в решении, которое не создавало тысячи подсказок cmd при попытке выполнить команду ping с помощью команды start. И он работает быстрее (~ 10 секунд для моего диапазона 60k) с fixedThreadPool.