2010-01-26 53 views
1

我試着用巴塞爾解析我的dhcpd.lease文件。一個典型的條目是這樣的:用Bash解析dhcpd.lease文件

lease 192.168.20.4 { 
    starts 6 2009/06/27 00:40:00; 
    ends 6 2009/06/27 12:40:00; 
    hardware ethernet 00:00:00:00:00:00; 
    uid 00:00:00:00:00:00; 
    client-hostname "examle-workstation1"; 
} 

我得到的所有信息是MAC和我想要的是IP和客戶端主機名。但也許,沒有客戶端主機名。入口看起來是這樣的:

lease 192.168.20.5 { 
    starts 6 2009/06/27 00:40:00; 
    ends 6 2009/06/27 12:40:00; 
    hardware ethernet 00:00:00:00:00:00; 
} 

我的第一個想法是到grep租賃屬性,硬件以太網屬性和uid屬性和推杆都放在同一行。然後解析它。

但我的問題是,我有一個很大的文件分配在許多文件中的許多條目。樹看起來像這樣:

dhcpd-leases 
-- 192.168.20.0 
-- 192.168.30.0 
-- 192.168.40.0 
[...] 

而我所得到的是從另一個文件解析到列表中的MAC。所以,我開始與這個名單,並希望到grep屬性IP,MAC與我的MAC:

for ENTRY in $MACLIST 
do 
    VAR$(cat "dhcpd-leases/10.148.$NETWORK.2/dhcpd.leases" | grep -E "$MAC|lease|client-hostname") 
    echo $VAR 
done 

但由於在$ VAR許多entrys和文件的即時通訊無法解析出來的權利。

can somenone help?

問候 彼得

回答

1

假設你maclist文件看起來像這樣(例如只有一個條目)

$ cat maclist 
00:00:00:00:00:01 

像這樣

$ cat file 
lease 192.168.20.4 { 
    starts 6 2009/06/27 00:40:00; 
    ends 6 2009/06/27 12:40:00; 
    hardware ethernet 00:00:00:00:00:00; 
    uid 00:00:00:00:00:00; 
    client-hostname "examle-workstation1"; 
} 

lease 192.168.20.5 { 
    starts 6 2009/06/27 00:40:00; 
    ends 6 2009/06/27 12:40:00; 
    hardware ethernet 00:00:00:00:00:00; 
} 

lease 192.168.20.6 { 
    starts 6 2009/06/27 00:40:00; 
    ends 6 2009/06/27 12:40:00; 
    hardware ethernet 00:00:00:00:00:01; 
    uid 00:00:00:00:00:01; 
    client-hostname "examle-workstation2"; 
} 


lease 192.168.20.7 { 
    starts 6 2009/06/27 00:40:00; 
    ends 6 2009/06/27 12:40:00; 
    hardware ethernet 01:00:00:00:00:00; 
} 

您的租賃文件,你可以試試這個

awk 'BEGIN{ 
    while((getline line < "maclist") > 0){ 
     mac[line] 
    } 
    RS="}" 
    FS="\n" 
} 
/lease/{ 
    for(i=1;i<=NF;i++){ 
     gsub(";","",$i) 
     if ($i ~ /lease/) { 
      m=split($i, IP," ") 
      ip=IP[2] 
     } 
     if($i ~ /hardware/){ 
      m=split($i, hw," ") 
      ether=hw[3] 
     } 
     if ($i ~ /client-hostname/){ 
      m=split($i,ch, " ") 
      hostname=ch[2] 
     } 
     if ($i ~ /uid/){ 
      m=split($i,ui, " ") 
      uid=ui[2] 
     } 
    } 
    if (ether in mac){ 
     print "ip: "ip " hostname: "hostname " ether: "ether " uid: "uid 
    } 
} ' file 

輸出

$ ./shell.sh 
hostname: "examle-workstation2" ether: 00:00:00:00:00:01 uid: 00:00:00:00:00:01 
+0

謝謝。效果很好。 :) – fwaechter 2010-01-27 14:02:44

1

如果你想獲得MAC的和IP的,這將是更好地使用,而不是看DHCP租約文件arp -s命令。

希望這會有所幫助, 最好的問候, 湯姆。

0

對不起,挖掘出這個問題,但你需要花費大約重複項護理中爲dhcpd.leases

lease 192.168.20.4 { 
    starts 6 2009/06/27 00:40:00; 
    ends 6 2009/06/27 12:40:00; 
    hardware ethernet 00:00:00:00:00:00; 
    uid 00:00:00:00:00:00; 
    client-hostname "examle-workstation1"; 
} 
lease 192.168.20.4 { 
    starts 6 2009/06/27 00:41:00; 
    ends 6 2009/06/27 13:42:00; 
    hardware ethernet 00:00:00:00:00:00; 
    uid 00:00:00:00:00:00; 
    client-hostname "examle-workstation1"; 
} 

(注意第一個開始/結束和第二個之間的小縫隙)。

我不知道如何以及何時發生這種情況,但我認爲主要的原因是,當客戶端發送DHCPREQUEST幾次......

1

我喜歡的awk,但我喜歡它少當程序變得大了。

所以,我發現解析租賃文件,找到第一個該文件轉換成兩列的格式,在第一列中的IP地址,在第二個MAC地址的unix命令鏈的另一種方式:

cat dhcpd.leases | egrep -o 'lease.*{|ethernet.*;' | awk '{print $2}' | xargs -n 2 | cut -d ';' -f 1 

用一個簡單的awk命令,你就可以從mac地址獲得ip地址。以下是作爲shell函數構建的完整命令:

function f_mac_to_ip { 

parseResult=$(cat /var/lib/dhcp/db/dhcpd.leases | egrep -o 'lease.*{|ethernet.*;' | awk '{print $2}' | xargs -n 2 | cut -d ';' -f 1 | grep $1 | awk '{print $1}') 
    echo "$parseResult" 
} 

我對租約格式不太瞭解。如果有可能沒有「以太網」字段的條目,則上述解析將不起作用。

+0

[無用的'cat'](http://www.iki.fi/era/unix/award.html)和相關的反模式。除非您特別連接多個輸入文件,並且很少有多於'grep','sed'和Awk中的一個,否則您應該需要零個'cat'實例,因爲列表中的每個文件都具有包含所有功能的功能集(儘管一些轉換,例如換行符的轉換確實需要多次調用,所以有時候兩個甚至三個轉換可能是合理的)。 – tripleee 2017-03-02 06:44:31