2017-07-18 28 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 

MACアドレスが00:01:0Aから始まるCISCOデバイス。 openwrt/Unixに、ファイルからMAC LISTに関するすべてのデバイスの対応するIPアドレス、名前、およびMACアドレスを取得するためのbashスクリプトを作成します。 MAC LISTにリセットされたデバイスが見つからない場合、スクリプトはNULLを返します。スクリプトを使用してこのアドレス一覧を解析するにはどうすればよいですか?助言がありますか ?

更新:

私はDHCPとベンダーMACアドレスの最初の3桁を比較するには、ファイルをリースしています。

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

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

とdhcp.leasesが含まれています:OpenWrtの@

ルートを:/ DHCP /#猫の/ tmpたとえば私のリストは、ベンダーMACがMAC.txtファイル内(3桁)に対処以下が含まれています.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.leasesファイルとdhcpのリースファイルのMACアドレスとMAC.txtファイルを比較したいと思います。 最初の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 

ここawを処理してboにするthファイルMAC(維持されたリスト)とdhcp.leases。 "MAC LIST"という文字列が遭遇したときに、MACアドレスの配列を "macs"に配置するように区切りを設定し、dhcp.leasesファイル(FNR - ファイル番号レコード1ですが、両方のファイルの番号レコードが1つではありません)、変数STRT = 1を設定してdhcp.leasesファイルの処理を指定します(STRT = 1の場合(dhcpにあります)。リースファイル)、フィールドデリミタ(FS)を ""に変更し、macs配列パターン内の各MACアドレスをループして、ライン上の2番目に区切られたデータ(フルMACアドレス)と照合します。データを取得し、macアドレスで配列 "found"を設定します。最終的に "mac"の各MACアドレスをループし、再び "found"という配列をチェックします。見つかったエントリが存在する場合(1)、無視します。それ以外の場合はNULLを出力します。

+0

質問を明確に更新しました。これで完了したことを確認してください。貴重な提案をありがとう。 –

+0

あなたのスクリプトの 'MAC dhcp.leases'の最後の行は何ですか?それはファイルパスですか?私は 'MAC/tmp/dhcp.leases'に変更することができます –

+0

MACはあなたが維持しているファイルです(MAC LISTテキストが入っています)。dhcp.leasesはdhcp leasesファイルです。 awkは両方のファイルを処理しています。 –

関連する問題