如何从 Openwrt 中的 DHCP 租约文件解析特定的 MAC 地址?

How to parse a particular MAC address from DHCP lease file in Openwrt?

我正在尝试编写一个脚本来从 Openwrt 中的 DHCP 租约文件中解析一些具有相应地址的设备。我正在维护一个包含一些供应商 MAC 地址的列表。当我将设备连接到路由器时,我想使用供应商 MAC 从 DHCP 租约文件中获取该设备的 IP 地址、MAC 地址和名称。

例如,如果我维护了 MAC 地址列表,例如

MAC LIST =  {"00:01:0A","00:00:1A","00:00:39"}
where ,
    00:01:0A - CISCO
    00:00:1A - AMD  
    00:00:39 - Toshiba TOSHIBA CORPORATION

并且在 Openwrt dhcp 租约文件中包含不同的设备例如:

root@OpenWrt:/# cat /tmp/dhcp.leases

1568953482  70:B3:D5:14:D0:31 192.168.3.51 device1 01:70:B3:D5:14:D0:31
2867821468  38:B8:EB:10:00:22 192.168.5.93 device2 01:38:B8:EB:10:00:22
8984532872  00:01:0A:33:11:33 192.168.5.44 CISCOee 01:00:01:0A:33:11:33

Where, 2nd column - MAC address , 3rd column - IP address and 4th column- Name

我在这里得到一个 CISCO 设备,其地址 MAC 从 00:01:0A 开始。我想在 openwrt/Unix 中编写一个 bash 脚本来从 /tmp/dhcp.leases 中获取所有设备相对于 MAC LIST 的相应 IP 地址、名称和 MAC 地址] 文件 。如果没有找到重置为 MAC LIST 的设备,脚本应该 return NULL 。我如何使用脚本解析此地址列表?有什么建议么 ?

更新:

我想将供应商 MAC 地址的前 3 位数字与 dhcp 租约文件进行比较。例如,我的列表在 MAC.txt 文件中包含以下供应商 MAC 地址(3 位 ):

/usr/MAC.txt
---------

     00:01:0A
     00:00:1A
     00:00:39

和 dhcp.leases 包含:

root@OpenWrt:/# cat /tmp/dhcp.leases

1568953482  70:B3:D5:14:D0:31 192.168.3.51 device1 01:70:B3:D5:14:D0:31
2867821468  38:B8:EB:10:00:22 192.168.5.93 device2 01:38:B8:EB:10:00:22
8984532873  00:01:0A:33:11:33 192.168.5.44 CISCOee1 01:00:01:0A:33:11:33
8984532874  00:01:0A:34:12:34 192.168.5.44 CISCOee2 01:00:01:0A:34:12:34

现在我想比较来自 MAC.txt 文件和 dhcp.leases 文件的 dhcp 租约文件 MAC 地址。如果前3位数字匹配,那么我要returnIP地址,MAC地址和匹配设备的名称。

Sample output :

         00:01:0A:33:11:33 192.168.5.44 CISCOee1
         00:01:0A:34:12:34 192.168.5.44 CISCOee2

如果没有找到,则发送 NULL 作为输出。

不确定这是否是您要查找的内容,但是:

MAC 文件内容:

MAC LIST =  {"00:01:0A","00:00:1A","00:00:39"}
where ,
   00:01:0A - CISCO
   00:00:1A - AMD  
   00:00:39 - Toshiba TOSHIBA CORPORATION 

解决方案:

awk -F\" '/MAC LIST/ { for (i=2;i<=NF-1;i++) { maccie=gensub(",","","g",$i);if ( maccie != "") { macs[maccie]="" } } } FNR==1 && NR != 1 { STRT=1 } STRT==1 { for (i in macs) { FS=" ";if ( ~ i) { print " - ";found[i]=1 } } } END { for (i in macs) { if ( found[i]!=1 ) { print i" - NULL"} } }' MAC dhcp.leases

输出

00:01:0A:33:11:33 - 192.168.5.44
00:00:1A - NULL
00:00:39 - NULL

这里我们让 awk 处理文件 MAC(维护的列表)和 dhcp.leases。我们将分隔符设置为 " 然后构建一个 mac 地址数组,当在行中遇到字符串 "MAC LIST" 时将它们放在 "macs" 中。一旦我们到达 dhcp.leases 文件(FNR - 文件编号记录为 1 但两个文件的编号记录不是一个)我们设置一个变量 STRT=1 表示处理 dhcp.leases 文件。当 STRT=1(我们在dhcp.leases 文件)我们将字段分隔符 (FS) 更改为 " " 并遍历 macs 数组模式中的每个 mac 地址,使其与行中的第二个分隔数据匹配(完整的 MAC 地址)如果匹配,我们打印出数据并设置一个数组 "found" 和 mac 地址。最后我们循环遍历每个 mac 地址"mac" 再次检查数组 "found"。如果找到的条目存在(等于 1),则忽略,否则打印 NULL。