使用Bash脚本返回本地网络中活动接口的MAC地址



我在本地网络中有一台Ubuntu服务器,该服务器上有许多其他设备,包括局域网和无线设备。我想运行一个Bash脚本来找出本地网络中所有机器上正在使用的接口的MAC地址(每台机器只有一个(。这意味着,根据某人的笔记本电脑使用的是什么(局域网、无线或其他(,它将只返回活动接口的地址。

我不确定该使用哪个命令(也许是arp?(。ifconfig只适用于我的本地机器,但我想做一些类似于Stack Overflow问题中的正则表达式的事情从ifconfig的输出中提取MAC地址的最佳方法

我该怎么做?

对于已启用的接口,大多数unix在ifconfig(8(输出的标志行上都提供了一个"UP"标志,您可以在这一点上进行匹配。

eth0      Link encap:Ethernet  HWaddr 00:01:29:a3:f6:1d  
          inet addr:192.168.0.254  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::201:29ff:fea3:f61d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:35163720 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36652372 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:32425323589 (32.4 GB)  TX bytes:4255769808 (4.2 GB)
          Interrupt:17 

(注意第4行的UP(

然而,您可以启用多个接口,在这种情况下,您可能需要查看路由,以确定哪个接口将用于默认路由的路径(ifconfig-rn将对此有所帮助(

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
.
.
.
0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0

这里的0.0.0.0条目是默认路由,192.168.0.1将是将用作默认路由的主机,eth0是流量将经过的接口。

使用UNIX arp命令很容易做到这一点,但您只能看到arp表中主机的MAC地址。用子网上的每个主机填充表的最佳方法是使用带有-sP参数的nmap。

简而言之:

netstat -rn (local subnet/mask)

然后

/sbin/arp -n 

最新更新