2010-01-26 5 views
1

I Essayez d'analyser mon fichier dhcpd.lease avec Basel. Une entrée typique ressemble à ceci:Analyser un fichier dhcpd.lease avec Bash

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"; 
} 

Toutes les informations que je reçois est le MAC et ce que je veux ist l'adresse IP et le nom du client. Mais peut-être, il n'y a pas de nom de client-hostname. L'entrée ressemble à ceci:

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; 
} 

Ma première idée était de grep l'attribut de location, l'attribut Ethernet matériel et l'attribut uid et putt tout sur une seule ligne. Et puis analyser.

Mais mon problème est, j'ai un gros fichier avec de nombreuses entrées allouées dans de nombreux fichiers. L'arbre ressemble à ceci:

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

Et tout ce que je reçois ist les MACs analysés d'un autre fichier dans une liste. Donc, je commence avec cette liste et que vous souhaitez grep l'ip Attributs, mac avec mon 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 

Mais en raison des nombreux entrys dans le VAR $ et les fichiers im incapable de parser à droite.

Est-ce que somenone peut aider?

Meilleures salutations Peter

Répondre

1

en supposant que votre look fichier maclist comme celui-ci (juste une entrée par exemple)

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

et votre dossier de location comme celui-ci

$ 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; 
} 

vous pouvez essayer cette

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 

sortie

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

Merci. Fonctionne bien. :) – fwaechter

1

Si vous essayez d'obtenir de la MAC et de la propriété intellectuelle, il serait préférable d'utiliser la commande arp -s au lieu de regarder le fichier de location de dhcp.

Espérons que cela aide, Cordialement, Tom.

0

Text::DHCPLeases ferait également exactement ce dont vous avez besoin, sans réinventer la roue. :)

0

Désolé pour creuser cette question sur mais vous devez prendre soin sur les entrées dupliquées dhcpd.leases à l'intérieur

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"; 
} 

(Notez le petit écart entre les premiers départs/extrémités et le second).

Je ne suis pas sûr de savoir comment et quand cela arrive, mais je pense que la raison principale est lorsque le client envoie DHCPREQUEST plusieurs fois ...

1

J'aime awk, mais je l'aime moins quand le programme deviendra grand.

donc j'ai trouvé une autre façon de l'analyse du fichier de baux, trouver d'abord une chaîne de commande unix qui convertit le fichier dans un format deux colonnes, l'adresse IP dans la première colonne, l'adresse MAC dans la seconde:

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

avec une commande awk simple, vous pouvez ensuite obtenir l'adresse IP de l'adresse mac. Voici la commande complète construite comme une fonction 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" 
} 

Je ne connais pas grand chose au format des baux. Si jamais il peut y avoir des entrées sans un champ "ethernet", l'analyse ci-dessus ne fonctionnerait pas.

+0

Cette odeur de [utilisation inutile de 'cat'] (http://www.iki.fi/era/unix/award.html) et les antipatternes connexes. Vous devriez avoir zéro instance 'cat' à moins que vous ne concateniez spécifiquement plusieurs fichiers d'entrée, et rarement plus d'un dans' grep', 'sed', et Awk, car chaque élément de la liste a un ensemble de fonctionnalités qui englobe toutes les fonctionnalités de l'outil précédent dans la liste (bien que certaines transformations qui, par exemple, se déplacent autour des sauts de ligne appellent des invocations multiples, parfois deux ou même trois peuvent être raisonnables). – tripleee

Questions connexes