2017-07-18 115 views
0

我想写一个脚本来解析Openwrt中的DHCP租约文件的一些设备与相应的地址。我维护一个供应商MAC地址列表。当我将设备连接到路由器时,我想从DHCP租赁文件中使用供应商MAC获取该设备的IP地址,MAC地址和名称。如何在Openwrt中解析来自DHCP租约文件的特定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租用文件包含不同的设备例如

[email protected]:/# 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的设备,则该脚本应返回NULL。我怎样才能解析这个地址列表使用脚本?有什么建议么 ?

更新:

我想将第一3位商MAC地址的DHCP与比较租赁文件。例如我的列表中包含的文件MAC.txt下列供应商的MAC地址(3位):

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

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

和dhcp.leases包含:

根@的OpenWrt:/#猫的/ 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 

现在我想比较dhcp租赁文件的MAC地址从MAC.txt文件与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

不知道这是你在找什么,但:

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来处理博th文件MAC(维护的列表)和dhcp.leases。我们将分隔符设置为“,然后在行中遇到字符串”MAC LIST“时,构建一组将mac地址放入”mac“的mac地址。一旦我们到达dhcp.leases文件(FNR - 文件编号记录是1但两个文件的数字记录不是一个)我们设置一个变量STRT = 1来表示对dhcp.leases文件的处理。当STRT = 1时(我们在dhcp中。租用文件)我们将字段分隔符(FS)更改为“”,并通过macs数组模式中的每个mac地址进行循环,匹配该行上的第二个分隔数据段(完整MAC地址)。如果匹配,我们会打印出数据并用MAC地址设置“找到”数组。然后,我们再次遍历“mac”中的每个mac地址,再次检查“found”数组。如果找到的条目存在(等于1),则忽略,否则打印NULL。

+0

我更新了我的问题。请确保你完成了这个。感谢您的宝贵建议。 –

+0

脚本中最后一行'MAC dhcp.leases'是什么?它是文件路径吗?所以我可以更改为'MAC/tmp/dhcp.leases' –

+0

MAC是您维护的文件(包含文本MAC LIST)dhcp.leases是dhcp租约文件。 Awk正在处理这两个文件。 –