" Existe um [...] arquivo ligando endereços MAC a endereços IP [...] no Linux? "
Sim, mais ou menos: / proc / net / arp . Mas, claro, isso não é um arquivo permanente real.
O arquivo padrão para sua finalidade é / etc / ethers , mas você precisa criá-lo e preenchê-lo. Fazer isso manualmente é chato, mas escrever uma linha de comando para fazer isso é divertido.
Você pode
-
pingando todos os hosts e parse / proc / net / arp (ou arp -n
se não estiver no Linux),
-
ou pode utilizar o nmap ( sudo apt-get install nmap
?) para analisar a rede local e fornecer-lhe os endereços IP e MAC.
A primeira solução poderia ser algo assim:
for i in 'seq 1 254'; do
ip=192.168.1.$i
if ping -c 1 -w 1 $ip >/dev/null; then
mac=$(grep "^$ip" /proc/net/arp | awk '{print $4}')
echo "$mac $ip"
fi
done
A solução nmap, que deve ser mais rápida, pode ser assim:
sudo nmap -sP -n -oN - 192.168.1.0/24 | \
perl -nle 'if (/ \b ([0-9\.]{7,15}) \b /x) {$ip=$1} elsif (/ ([0-9A-F:]{17}) /i) {print "$1 $ip"}'
Para obter também os nomes DNS, você pode enviar a saída de cima por meio de algo como
| while read mac ip; do name=$(dig -x $ip +short | grep -v '^;'); [ -n "$name" ] && ip=$name; echo "$mac $ip"; done
(Com a solução nmap, você também pode remover a opção -n
e adaptar o regex para obter o nome. Se você realmente gosta de expressões regulares).