我在本地网络中有一台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