Рейтинг:1

Проверка наличия mac-адреса в моей сети работает ненадежно

флаг in
Cas

У меня есть массив mac-адресов, и когда их всех нет в сети, хочется что-то сделать. Это был мой первоначальный план:

mac_addresses=('1' '2' '3')
arp_output=$(арп)
для уровня в "${mac_addresses[@]}"
делать
   эхо "$arp_output" | grep -iq "$ уровень" || mac_count=$((mac_count+1))
сделано

если [[ "$mac_count" = "${#mac_addresses[@]}" ]]
тогда
   сделай что-нибудь
фи

Я использовал mac-адрес своего телефона, чтобы проверить его. Так что только один элемент в массиве: мой телефон.

Я заметил, что скрипт работает ненадежно. Когда мой телефон был подключен к сети, скрипт ничего не делал. Хороший. Когда я отключаю свой телефон от сети (то есть выключаю Wi-Fi), он по-прежнему ничего не делает, хотя к этому моменту должен был бы (потому что мой телефон больше не присутствует в сети, и это единственный в массиве, поэтому он должен делать что-то к этому моменту).

Поэтому я попробовал другой способ: используя судо нмап -сн 192.168.2.*. Однако это тоже не работает.

Когда мой телефон присутствует, он ничего не делает. Я отключаю телефон, и он что-то делает. Я снова подключаю свой телефон, и он все еще что-то делает, хотя мой телефон снова присутствует в сети. И дело не в секундах. Мой телефон снова был в сети уже 20 минут, и он все еще что-то делает.

Есть ли способ исправить это? Это из-за какого-то кэширования?

РЕДАКТИРОВАТЬ: [Ответ Мински]

См. следующее:

# "1" будет mac-адресом моего телефона
арп | grep -i "1" #телефон подключен к Wi-Fi
192.168.2.16 эфир 1 C enp3s0

#ТЕЛЕФОН ОТКЛЮЧЕН

арп | grep -i "1" #телефон не подключен к Wi-Fi
192.168.2.16 эфир 1 C enp3s0
арп | grep -i "1" #телефон не подключен к Wi-Fi
192.168.2.16 эфир 1 C enp3s0
арп | grep -i "1" #телефон не подключен к Wi-Fi
192.168.2.16 эфир 1 C enp3s0

пинг -б 192.168.2.255
Большой выход; 192.168.2.16 не отображается в выводе

арп | grep -i "1" #телефон не подключен к Wi-Fi
192.168.2.16 эфир 1 C enp3s0

#ТЕЛЕФОН ПОВТОРНО ПОДКЛЮЧЕН

арп | grep -i "1" #телефон подключен к Wi-Fi
192.168.2.16 эфир 1 C enp3s0

sudo nmap -sn 192.168.2.* | группа "1"
#НЕТ ОТВЕТА; КОД ВЫХОДА 1
флаг ru
ARP работает только в вашем сетевом сегменте — находится ли он за пределами диапазона вашей локальной сети в отдельном диапазоне IP-адресов? В вашем Wi-Fi-роутере/системе настроена «конфиденциальность», которая изолирует устройства друг от друга?
Cas avatar
флаг in
Cas
нет по обоим вопросам. Оба устройства находятся в `192.168.2.XXX`, и маршрутизатор не настроен на изоляцию устройств (разве это не только vlan?).
Minsky avatar
флаг mx
Следит ли `arp` на компьютере за подключением/отключением телефона? По крайней мере, на моем ноутбуке мне нужно запустить `ping -b ` или не обновляет устройства (иногда). [[ удаление пред. комментарии, чтобы держать его в чистоте.]]
Cas avatar
флаг in
Cas
@Minsky см. редактирование в исходном сообщении
meuh avatar
флаг cn
Таблица arp представляет собой кеш, поэтому старые записи удаляются только через определенное время. Вы должны полагаться на ответ `ping`, чтобы увидеть, есть ли еще устройство. См. также `man ip Neighbor`, который заменяет команду `arp`. Вы можете сбросить кеш с помощью `ip neigh flush dev eth0`, где eth0 — это интерфейс, перед широковещательным пингом.
Cas avatar
флаг in
Cas
Конечно, проще пропинговать устройство. Но у меня есть только mac-адрес, а не ip-адрес. Так что я не могу знать, какой IP-адрес пинговать. У меня есть только mac-адрес. Поэтому мне сначала нужно «преобразовать» mac-адрес в его ip-адрес. Однако, как вы можете это сделать?
meuh avatar
флаг cn
Вы уже выполняете широковещательный ping, `ping -b 192.168.2.255`. Это должно заполнить таблицу arp для любых онлайн-устройств с IP-адресом 192.168.2.*.

Ответить или комментировать

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