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

时间:2017-07-18 09:16:35

标签: linux shell mac-address openwrt dhcp

我正在尝试编写一个脚本来解析Openwrt中DHCP租约文件中的一些设备以及相应的地址。我维护一个包含某些供应商MAC地址的列表。当我将设备连接到路由器时,我想使用DHCP租约文件中的供应商MAC获取该设备的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

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

更新:

我想将供应商MAC地址的前3位数与dhcp leases文件进行比较。例如,我的列表在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文件MAC地址和dhcp.leases文件。如果前3位匹配,那么我想返回IP地址,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作为输出。

1 个答案:

答案 0 :(得分:1)

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

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 ($2 ~ i) { print $2" - "$3;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 LIST“时构建一个mac地址数组,将它们放在”macs“中。一旦我们到达dhcp.leases文件(FNR - 文件号记录)是1,但两个文件的数字记录不是一个)我们设置一个变量STRT = 1来表示dhcp.leases文件的处理。当STRT = 1(我们在dhcp.leases文件中)时,我们更改字段分隔符( FS)“”并循环遍历macs数组模式中的每个mac地址,使其与行上的第二个分隔数据(完整MAC地址)匹配如果匹配,我们打印出数据并设置一个数组“found”然后我们终于遍历“mac”中的每个mac地址再次检查数组“found”。如果找到了一个条目(等于1),则忽略,否则打印NULL。