Як знайти всі пристрої (IP-адреса, ім'я хосту, MAC-адреса) у локальній мережі?


14

Я читав майже кожну тему, пов’язану з цим, але ніхто не спростив доступ до такої таблиці, як наведена нижче.

  IP Address     Hostname        MAC Address
  192.168.1.10 | myAppleTV     | 02:78:42:9b:bb:12
  192.168.1.10 | myiPhone      | b2:18:4a:3a:42:22
  192.168.1.10 | myiMac        | 09:17:a2:95:c4:00
  192.168.1.10 | myCanonPrinter| a0:ea:72:77:b4:aa

Більшу частину часу я використовую arp -aі є dns-sb, але жоден з них не спрощує пошук 3 ключових фрагментів інформації, коли я безладдя в мережі, тобто IP-адреса, ім'я хосту та MAC-адреса. Я здивований, що не існує утиліти, яка б це здійснила!


Така інформація в основному буде надходити на маршрутизатор
користувач151019

Відповіді:


12

Якщо використання сторонньої утиліти не є проблемою для вас, рекомендую спробувати:

арп-сканування (доступне через Homebrew )

brew install arp-scan
arp-scan --localnet

fing (завантажте та встановіть пакет "Настільний вбудований CLI" з fing.com або через Homebrew brew cask install fing)

sudo fing -r 1 -d true -o table,text

Обидві утиліти мають ряд додаткових режимів та функцій. Я пропоную прочитати посібники повністю, щоб максимально використати їх.

Якщо вам потрібно уникати використання сторонніх інструментів, то ось спосіб зробити щось подібне із вбудованими командами. Ви можете запускати їх інтерактивно, але, мабуть, простіше зберегти це як сценарій. Зауважте , що цей сценарій не перевіряє помилок і працює лише в / 24 підмережах. Змінення його для роботи в підмережах інших розмірів залишається читачем як вправа :)

#!/usr/bin/env bash
tab=$'\t'
pIF=$(echo "show State:/Network/Global/IPv4" | scutil | awk -F: '/PrimaryInterface/{sub(/ /,"",$2); print $2}')
sn=$(ipconfig getifaddr $pIF | sed -En 's/^([0-9]+\.[0-9]+\.[0-9]+).*/\1/p')
for i in {1..254}; do ping -i0.1 -W100 -c1 $sn.$i | grep from; done
arp -a | grep $pIF | sed -e 's/^\?/unnamed/' -e "s/\ at\ /${tab}/g" -e "s/\ on\ /${tab}/g" -e 's/\ ifscope.*$//g' | awk 'BEGIN { FS="\t"; OFS="\t"; printf "%-17s\t%-15s\t%s\n", "MAC","INTERFACE","HOSTNAME (IP)" } { if($2!="(incomplete)") {printf "%-17s\t%-15s\t%s\n",$2,$3,$1}}'

Це має вивести щось на кшталт:

MAC                 INTERFACE       HOSTNAME (IP)
0:90:b:7a:85:62     en0             r1.lan (192.168.20.1)
2c:36:f8:48:2b:47   en0             cisco-sg300-10p.lan (192.168.20.2)
84:78:ac:a6:95:a0   en0             cisco-sg300-20.lan (192.168.20.3)
b4:fb:e4:cb:93:85   en0             wap1.lan (192.168.20.10)
0:11:32:10:cd:c1    en0             nas.lan (192.168.20.20)
0:11:32:3d:99:c9    en0             nas2.lan (192.168.20.21)
0:11:32:10:cd:c1    en0             unnamed (192.168.20.23)
d4:4b:5e:fe:6a:75   en0             brwd44b5efe6a75.lan (192.168.20.90)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.