Мне нужно написать bash-скрипт, в котором я должен создать файл, содержащий данные об IP-адресах хостов и их сопоставление с соответствующими MAC-адресами.
Есть ли какой-либо способ, с помощью которого я могу определить MAC-адрес любого (удаленного) хоста, если у меня есть IP-адрес хоста?
Если вы просто хотите узнать MAC-адрес данного IP-адреса, вы можете использовать команду arp, чтобы найти его, после того, как вы один раз отправили ping системе.
Пример
$ ping skinner -c 1PING skinner.bubba.net (192.168.1.3) 56(84) bytes of data.64 bytes from skinner.bubba.net (192.168.1.3): icmp_seq=1 ttl=64 time=3.09 ms— skinner.bubba.net ping statistics —1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 3.097/3.097/3.097/0.000 ms
Теперь посмотрите в таблице ARP:
$ arp -askinner.bubba.net (192.168.1.3) at 00:19:d1:e8:4c:95 [ether] on wlp3s0
fing
Если вы хотите сканировать всю локальную сеть для поиска MAC-адресов, вы можете использовать командную строку утилиты fing для этого. Обычно она не установлена, поэтому вам придется скачать и установить ее вручную.
$ sudo fing 10.9.8.0/24

Использование ip
Если у вас нет доступных команд arp или fing, вы можете использовать команду iproute2 ip neigh, чтобы увидеть таблицу ARP вашей системы вместо этого:
$ ip neigh192.168.1.61 dev eth0 lladdr b8:27:eb:87:74:11 REACHABLE192.168.1.70 dev eth0 lladdr 30:b5:c2:3d:6c:37 STALE192.168.1.95 dev eth0 lladdr f0:18:98:1d:26:e2 REACHABLE192.168.1.2 dev eth0 lladdr 14:cc:20:d4:56:2a STALE192.168.1.10 dev eth0 lladdr 00:22:15:91:c1:2d REACHABLE
Ссылки
Вы можете использовать команду arp:
arp -an
Но вы можете использовать эту команду только в LAN, если вы хотите узнать MAC-адрес любого удаленного хоста, возможно, вам нужно будет использовать какой-нибудь инструмент для захвата пакетов, такой как tcpdump, и разбирать результат.
Это из моего вопроса и ответа на Ask Ubuntu.
Вы можете использовать команду
sudo nmap -sP -PE -PA21,23,80,3389 192.168.1.*
nmap: Инструмент исследования сети и сканер безопасности / портов. Из руководства:
-sP (Пропустить сканирование портов): Эта опция говорит Nmap не сканировать порты после обнаружения хоста и только выводить доступные хосты, которые ответили на сканирование. Это часто называют «сканированием пингами», но вы также можете запросить выполнение трассировки и сценариев хоста NSE. Это по умолчанию на один шаг более интрузивно, чем сканирование списка, и может использоваться для тех же целей. Это позволяет легкую разведку целевой сети без привлечения большого внимания. Знание того, сколько хостов включено, более ценно для атакующих, чем список, предоставляемый списком всех IP и имен хостов.
-PE; -PP; -PM (Типы ICMP Ping):
В дополнение к необычным типам обнаружения хостов TCP, UDP и SCTP, обсуждавшимся ранее, Nmap может отправлять стандартные пакеты, которые отправляет повсеместно распространенная программа ping. Nmap отправляет пакет типа ICMP 8 (запрос эха) на целевые IP-адреса, ожидая в ответ пакет типа 0 (ответ эха) от доступных хостов. К сожалению для исследователей сети, многие хосты и брандмауэры теперь блокируют эти пакеты, а не отвечают, как требуется в RFC 1122[2]. Поэтому сканирование только с ICMP редко достаточно надежно против неизвестных целей через Интернет. Но для системных администраторов, контролирующих внутреннюю сеть, они могут быть практичным и эффективным подходом. Используйте опцию -PE, чтобы включить это поведение запроса эха.-PA список портов (TCP ACK Ping):
TCP ACK ping очень схож с ранее обсужденным SYN ping. Разница, как вы, вероятно, могли догадаться, заключается в том, что флаг TCP ACK установлен вместо флага SYN. Такой пакет ACK предполагает подтверждение данных через установленное TCP соединение, но такого соединения не существует. Поэтому удаленные хосты всегда должны отвечать пакетом RST, раскрывая свое существование в процессе. Опция -PA использует тот же порт по умолчанию, что и SYN-запрос (80), и также может принимать список портов назначения в том же формате. Если непривилегированный пользователь пытается это, используется обсужденное ранее обходное решение для соединения. Это обходное решение несовершенно, поскольку соединение на самом деле отправляет пакет SYN вместо ACK.
21,23,80,3389: Порты для поиска.
192.168.1.*: Диапазон IP. замените на свой.
arping
arping -I <интерфейс> -c 1 <хост>
Команда должна вернуть MAC-адрес в ответе. Что-то вроде,
$ arping -I eth0 -c1 192.168.1.2ARPING 192.168.1.2 from 192.168.1.5 eth0Unicast reply from 192.168.1.2 [08:01:27:38:EF:32] 0.746msSent 1 probes (1 broadcast(s))Received 1 response(s)
arping предоставляется пакетом iputils-arping на Debian.
Имя активного сетевого устройства для моего компьютера можно найти, используя:
ip neigh | grep 192.168.2.1 | awk ‘BEGIN{FS=» «;}{print $3;}’
где 192.168.2.1 – это IP-адрес моего локального сетевого маршрутизатора.
Для моего компьютера эта команда возвращает: enp6s0
Используя это имя интерфейса, MAC-адрес моего компьютера можно получить, используя:
cat /sys/class/net/enp6s0/address
Использую обратные кавычки для окружения первой команды, обе команды можно комбинировать в одну строку так:
cat /sys/class/net/`ip neigh | grep 192.168.2.1 | awk ‘BEGIN{FS=» «;}{print $3;}’`/address
#!/bin/bash# Пример: записать как ~/bin/find_rtsp.sh; chmod +x ~/bin/find_rtsp.sh;# для поиска в подсетях хостов с открытым портом 554# find_rtsp.sh [подсеть]#find_rtsp (){if [[ «$1″ = » ]]then Ip_addresses_array=($(hostname —all-ip-addresses)) echo «##################################################» echo «# hostname —all-ip-addresses»else Ip_addresses_array=($*)fiecho «##################################################»echo «# ip-адреса для сканирования: ${Ip_addresses_array[*]}»Rtsp_ip_array=()Output=»»for Subnet in «${Ip_addresses_array[@]}» do Subnet=${Subnet%.*} echo «##################################################» echo «# Пожалуйста, подождите: nmap —open -p 554 -oG — ${Subnet}.1-254 | grep ‘Ports:'» echo «##################################################» Rtsp_ipaddresses=»$(nmap —open -p 554 -oG — ${Subnet}.1-254 | grep ‘Ports:’)» while read null Ip null Ports null; do Rtsp_ip_array+=(${Ip}); done <<< «$Rtsp_ipaddresses» Output+=»$Rtsp_ipaddresses»$’n’ done echo «Найдено: ${#Rtsp_ip_array[@]} : ${Rtsp_ip_array[@]}» for Ip in ${Rtsp_ip_array[@]} do Find_dev=$(ip neigh show ${Ip}) read IP_dev null dev null laddr state <<< «$Find_dev» echo ${IP_dev} ${laddr} ${dev} ${state} Cam_mac_array+=(${laddr}) done echo «$Output»}find_rtsp
У меня работает
#!/bin/bash# Пример: записать как ~/bin/Fiddev.sh; chmod +x ~/bin/Fiddev.sh;# nmap нуждается в —send-ip для обновления таблицы ARP системы? nmap —send-ip 192.168.0.1-254; ip -o -f inet addr showif [[ «$*» = » ]]then Ip_addresses_array=($(hostname —all-ip-addresses)) echo «###########################################################» echo «# hostname —all-ip-addresses»else Ip_addresses_array=($*);fi# Создать ассоциированные массивыdeclare -A devicelist # имя устройства: MAC-адресdeclare -A statuslist # имя устройства: статус в сетиdevicelist[Camera_01]=aa:bb:cc:dd:ee:01devicelist[Camera_02]=aa:bb:cc:dd:ee:02devicelist[Phone_01 ]=aa:bb:cc:dd:ee:03devicelist[Phone_02 ]=aa:bb:cc:dd:ee:04devicelist[Router_01]=aa:bb:cc:dd:ee:05devicelist[Server_01]=aa:bb:cc:dd:ee:06devicelist[SmartTV ]=aa:bb:cc:dd:ee:07# Цветовые константыBRed=’ 33[1;31m’ BGreen=’ 33[1;32m’ Reset=» 33[m» Red=»»$’ 33[0;31m'»» Green=»»$’ 33[0;32m'»» Reset=»»$’ 33[0;0m'»»Bold=»»$’ 33[1m'»» Blink=»»$’ 33[5m'»» Yellow=»»$’ 33[0;33m'»»Mac_to_ip(){ Find_dev=$(ip neighbour | grep -i «$mac») if [ $? -eq 0 ] then read IP_dev null dev null laddr state <<< «$Find_dev» echo ${IP_dev} else IP_dev=» fi}ping_subnet () { for IP in «${Subnet}.»{1..254}; do ping -c1 $IP | grep «64 bytes» & done; wait ; }ping_subnets (){ Ip_addresses_array=($*) echo «###########################################################» echo «# ip-адреса для сканирования: ${Ip_addresses_array[*]}» for Subnet in «${Ip_addresses_array[@]}» do Subnet=${Subnet%.*} echo «###########################################################» echo «# Пожалуйста, подождите: ping подсеть ${Subnet}.'{1..254}'» echo «###########################################################» ping_subnet done}# sudo ip -s -s neighbour flush all # для тестов с пустым кэшем arpping_subnets «${Ip_addresses_array[@]}» # чтобы восстановить кеш arp…while [ true ]; doclearecho «###########################################################»echo «# Список устройств : ${!devicelist[@]}»echo «# Список статусов : ${!statuslist[@]}»for devicename in «${!devicelist[@]}» do status=OFFLINE mac=»${devicelist[${devicename}]}» ip=$( Mac_to_ip $mac ) if [ ! -z $ip ] then ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null if [ $? -eq 0 ]; then status=ONLINE; fi else : fiecho «###########################################################» # если предыдущий статус устройства еще не зафиксирован, то зафиксируйте его сейчас. if [ ! ${statuslist[${devicename}]+_} ] then statuslist[${devicename}]=»$status» fi if [ «$status» = «ONLINE» ] then colour=»${BGreen} : » else colour=»${BRed} — » fi echo -e ${colour}${devicename}${Reset}: $ip : $mac : ${colour}$status${Reset} if [ ${statuslist[${devicename}]} != $status ] then echo «${Red}${Blink}# $status $devicename${Reset}» fi statuslist[$devicename]=$status doneecho «###########################################################»echo «# Список устройств : «${!devicelist[@]}»»echo «# Список статусов : «${!statuslist[@]}»»echo «————————————————————«echo «${Yellow}# Следующий скан через 30с${Reset} : ${Ip_addresses_array[@]}»; sleep 30;ping_subnets «${Ip_addresses_array[@]}» >& /dev/nulldone
Ответ или решение
Задача получения MAC-адреса для заданного IP-адреса в Linux может стать актуальной при решении различных задач в области управления сетями и диагностики. Ваша цель — создать bash-скрипт, который сохраняет соответствие IP-адресов хостов и их MAC-адресов в файле. Давайте рассмотрим, как можно это реализовать, используя разные подходы и утилиты.
Теория
MAC-адреса играют ключевую роль в локальных сетях, обеспечивая уникальную идентификацию устройств на уровне канала передачи данных. Обычно, для получения MAC-адреса устройства используется ARP (Address Resolution Protocol). Этот протокол позволяет разрешить сетевой адрес (IP) в физический адрес (MAC).
ARP работает следующим образом:
Когда компьютер хочет отправить данные другому устройству в локальной сети, он проверяет свою ARP-таблицу. Если в таблице найден IP-адрес получателя, соответствующий ему MAC-адрес извлекается и используется для передачи. Если такого соответствия нет, отправляется широковещательный запрос для получения MAC-адреса.
Пример
Простейший способ получить MAC-адрес по IP-адресу в Linux — это использовать команду arp. Основной порядок действий:
- Проверка доступности хоста. Для этого достаточно отправить на него одно ICMP-сообщение с помощью команды ping.
ping -c 1 <IP-адрес>
- Получение MAC-адреса. После выполнения команды ping запись будет содержаться в ARP-таблице, которую можно просмотреть с помощью команды:
arp -a
К примеру:
$ arp -a hostname (192.168.1.3) at 00:19:d1:e8:4c:95 [ether] on wlp3s0
Применение
Давайте объединим вышеописанное в автоматизированный сценарий на bash:
- Создаем файл скрипта и делаем его исполняемым:
touch get_mac.shchmod +x get_mac.sh
- Наполняем скрипт содержимым:
#!/bin/bash# Параметры: IP-адрес в качестве аргументаIP=»$1″if [[ -z «$IP» ]]; then echo «Ошибка: Не указан IP-адрес.» exit 1fi# Пинг хостаping -c 1 $IP > /dev/null# Получаем MAC-адрес с помощью arpMAC=$(arp -n | grep «$IP» | awk ‘{print $3}’)if [[ -z «$MAC» ]]; then echo «Не удалось получить MAC-адрес для IP: $IP»else echo «IP: $IP, MAC: $MAC» # Записываем в файл echo «$IP -> $MAC» >> ip_to_mac_mapping.txtfi
- Используем скрипт:
./get_mac.sh 192.168.1.3
Этот скрипт прост и эффективно выполняет основную задачу по разрешению IP-адресов в MAC-адреса для хостов в локальной сети. Он подходит для использования в управляемых сетях, где доступен ARP.
Дополнительные методы
Кроме команды arp, существуют и другие инструменты, которые могут помочь, если arp недоступен:
- Команда ip: Современный аналог команды arp, входящий в пакет iproute2.
ip neigh
- Утилита nmap: Может быть использована для сканирования сети и сбора информации о подключениях.
sudo nmap -sP -PE -PA21,23,80,3389 192.168.1.0/24
- Утилита fing: Помогает при полном сетевом сканировании для выявления всех активных устройств в сети (необходимо скачать отдельно).
Используя вышеописанные подходы, вы можете значительно упростить мониторинг устройств в сети и поддерживать актуальный список с отображением IP-адресов на MAC-адреса, что поможет в управлении и диагностики сетевых подключений.