Разобрать файл dhcpd.lease с помощью Bash - PullRequest
2 голосов
/ 27 января 2010

Я пытаюсь проанализировать мой файл 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-атрибут аренды, аппаратный Ethernet-атрибут и атрибут UID и поместить их все в одну строку. А потом разбери его.

Но моя проблема в том, что у меня большой файл с множеством записей, размещенных во многих файлах. Дерево выглядит так:

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

И все, что я получаю, это MAC, проанализированные из других файлов в список. Поэтому я начну с этого списка и хочу использовать атрибут 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 и файлов, которые я не могу разобрать правильно.

Может ли помочь соменон?

С наилучшими пожеланиями Питер

Ответы [ 4 ]

2 голосов
/ 27 января 2010

при условии, что ваш файл маклиста выглядит так (например, только одна запись)

$ 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
1 голос
/ 03 августа 2012

Мне нравится awk, но мне нравится меньше, когда программа становится большой.

Итак, я нашел другой способ анализа файла аренды, сначала обнаружив цепочку команд unix, которая преобразует файл в формат двух столбцов, IP-адрес в первом столбце, mac-адрес во втором:

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

с помощью простой команды awk вы можете получить IP-адрес из mac-адреса. Ниже приведена полная команда, созданная как функция оболочки:

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

Я не знаю много о формате аренды. Если когда-либо могут быть записи без поля «ethernet», приведенный выше синтаксический анализ не будет работать.

1 голос
/ 27 января 2010

Если вы пытаетесь получить MAC и IP, было бы лучше использовать команду arp -s вместо просмотра файла аренды DHCP.

0 голосов
/ 03 сентября 2010

Text :: DHCPLeases также будет делать именно то, что вам нужно, не изобретая колесо. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...