Могу ли я определить текущий IP-адрес с известного MAC-адреса?
У меня есть оболочка script, которая использует etherwake для пробуждения машины в моей локальной сети.
После того, как машина проснулась, я не уверен в IP-адресе.
Пытаясь ответить на мой собственный вопрос, я придумал:
ip=$(ping -c 1 hostname | head -1 | awk '{print $3}' | sed 's/[()]//g')
Это решение гласит, что я знаю имя хоста удаленной машины, что не так обременительно.
Есть ли способ получить IP-адрес, если все, что я знаю, это MAC-адрес?
Ответы
Ответ 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.