我希望能够使用 bash 脚本从网关获取 MAC 地址。
我的想法是获取网关IP:
netstat -nr | grep 默认值
但是我明白了:
默认 192.168.1.1 UGSc 77 0 en0
我需要以某种方式删除线路上的所有内容并使其只读取 IP,这样我就可以执行以下命令:
arp -n -i en0 $ip
如果有人可以帮助我或想出更好的方法,那就太好了!
请尝试
netstat -nr | grep default | awk '{print $1}'
如果您编写了大量 bash 脚本,您可能应该熟悉 awk,它可以执行此类操作(顺便说一句,它非常强大)。
适用于 Mac OS X 的另一个答案是:
route get default | grep -E '^\s+gateway:' | awk '{print $2}' | xargs arp | awk '{print $4}'
说明:
route get default
打印有关默认路由的信息,包括默认网关。$ route get default
route to: default
destination: default
mask: default
gateway: wormhole
interface: en0
flags: <UP,GATEWAY,DONE,STATIC,PRCLONING,GLOBAL>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 0
bash-3.2$ route get default
route to: default
destination: default
mask: default
gateway: wormhole
interface: en0
flags: <UP,GATEWAY,DONE,STATIC,PRCLONING,GLOBAL>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 0
grep
命令选择包含默认网关信息的 route
命令行。我不打算在这里提供任何类型的正则表达式入门,但“^”意味着模式必须从行首开始匹配,“\s+”部分意味着字符串之前必须有空格'gateway:',并且可以有任意数量的空格。$ route get default | grep -E '^\s+gateway:'
gateway: wormhole
awk
命令仅打印先前输出的第二列,即默认网关的主机名。4. $ route get default | grep -E '^\s+gateway:' | awk '{print $2}'
wormhole
xargs
用于将该主机名传递给 arp
,后者将响应有关该主机的信息,包括其 MAC 地址。$ route get default | grep -E '^\s+gateway:' | awk '{print $2}' | xargs arp
wormhole (192.168.1.1) at 74:ac:b9:54:4e:b9 on en0 ifscope [ethernet]
awk
,这次打印之前输出的第四列,其中包含 MAC 地址。$ route get default | grep -E '^\s+gateway:' | awk '{print $2}' | xargs arp | awk '{print $4}'
74:ac:b9:54:4e:b9