-1

チェックポイントとシスコのベンダーに一致するリストに基づいて、すべての Mac を取得する必要があります。Ciscoルーターで「show ip arp」を実行し、arp出力をキャッチしてファイルに保存します。今、私が持っている mac を 1 行ずつ確認する必要があります。

正確には、Cisco および Checkpoint ベンダーの MAC アドレスを含む行だけを照合する必要があります。そのためには、IP アドレス、最初の 4 桁の 16 進数、ドット、さらに 2 桁の 16 進数を取得して、Mac ベンダー (001c.7f または e02f.6d) を定義し、この行をファイルに出力する必要があります。その後、「IP-ARP.txt」と「MAC-ADDRESS.txt」を比較する必要があります (この最後のものには完全な MAC アドレス ベンダーが含まれています)。出力が一致する場合は、この行を別のファイルに保存します。

ここにファイルがあります:

IP-ARP.txt

Internet  172.20.14.12            0   001c.7f41.186e  ARPA

Internet  172.20.14.13           57   001c.7f41.074e  ARPA

Internet  172.20.14.14            0   0200.5ebd.e17d  ARPA

Internet  172.20.19.11            -   7081.050f.9402  ARPA

Internet  172.20.19.12           54   7cad.7499.e602  ARPA

Internet  172.20.19.13            7   e02f.6d14.c1bf  ARPA

Internet  172.20.19.14          104   e02f.6d15.1d7f  ARPA

MAC-ADDRESS.txt

001c.7f

001c.ab

001b.de

001b.ff

001c.cd

001c.de

e02f.6c

e02f.7c

前もって感謝します!

4

3 に答える 3

1

(仕様変更のため再更新)

ここにあるのは、識別文字列 (MAC アドレス文字列のフラグメントとして記述された OUI MAC アドレス部分) のリストと、このリストに対してチェックする必要があるデータ文字列のリストです。

私のソリューションではfileutil、Tcl ライブラリのパッケージを使用しています。標準の Tcl コマンドを使用できるため、必ずしも必要ではありませんが、スクリプトが大幅に簡素化されます。

package require fileutil

使用するファイル名をいくつか定義します。

set filename(macaddr) MAC-ADDRESS.txt
set filename(iparp)   IP-ARP.txt
set filename(output)  output.txt

識別文字列リストが変更される可能性がある場合は、スクリプトを実行するたびにファイルから読み取ることができます。

set idlist [::fileutil::cat $filename(macaddr)]

または、これらのアドレスがめったに変更されない場合は、スクリプトにハードコードして、必要に応じて編集することができます。

set idlist {001c.7f 001c.ab 001b.de 001b.ff 001c.cd 001c.de e02f.6c e02f.7c}

出力ファイルの内容を空の文字列に設定します。

::fileutil::writeFile $filename(output) {}

これらのアドレスのいずれかに一致するファイル内の行を選択するにはIP-ARP.txt、それをたどる方法がいくつかあります。私の提案は、fileutil::foreachLineコマンドを使用することです。基本的な呼び出しは次のようになります。

::fileutil::foreachLine varName filename script

(最初のパラメーターは任意の変数名です。反復ごとに現在の行がその変数に格納されます。2 番目はトラバースするファイルの名前で、3 番目のパラメーターはそのファイルのすべての行に対して 1 回実行するスクリプトです。 .)

スクリプトは、コマンドを使用して ID 文字列に一致するコマンドを呼び出しますstring match。代わりにコマンドを使用するregexpこともできますが、この場合はまったく不要だと思います。ファイル内のすべての行はIP-ARP.txt空白か、5 つの要素を持つ適切な Tcl リストです。MAC アドレスは 4 番目です。また、2 番目の要素は ip 番号で、172 で始まるものだけが使用されます。これは、一致するコマンドが次のように記述できることを意味します。

proc matchid {idlist line} {
    set ipAddr  [lindex $line 1]
    set macAddr [lindex $line 3]

    if {[string match 172* $ipAddr]} {
        foreach id $idlist {
            if {[string match $id* $macAddr]} {
                return "$ipAddr $macAddr\n"
            }
        }
    }
}

(この方法での IP アドレスの照合は、アドレスが小数点付き 10 進形式の場合にのみ機能します。他の形式の場合は、Tcllib ip モジュールを使用して照合する必要があります。)

コマンドの結果は、行が一致した場合は IP アドレスと MAC アドレスを含む行になり、一致しなかった場合は空の文字列になります。

IP-ARP.txt次に、ファイルの内容をたどってみましょう。各行について、内容を id リストと照合し、出力文字列または空の文字列を取得します。文字列が空でない場合は、出力ファイルに追加します。

::fileutil::foreachLine line $filename(iparp) {
    set res [matchid $idlist $line]

    if {$res ne {}} {
        ::fileutil::appendToFile $filename(output) $res 
    }
}

以上です。完全なプログラム:


package require fileutil

set filename(macaddr) MAC-ADDRESS.txt
set filename(iparp)   IP-ARP.txt
set filename(output)  output.txt

set idlist [::fileutil::cat $filename(macaddr)]

::fileutil::writeFile $filename(output) {}

proc matchid {idlist line} {
    set ipAddr  [lindex $line 1]
    set macAddr [lindex $line 3]

    if {[string match 172* $ipAddr]} {
        foreach id $idlist {
            if {[string match $id* $macAddr]} {
                return "$ipAddr $macAddr\n"
            }
        }
    }
}

::fileutil::foreachLine line $filename(iparp) {
    set res [matchid $idlist $line]

    if {$res ne {}} {
        ::fileutil::appendToFile $filename(output) $res 
    }
}

Tcllib fileutil モジュールのドキュメント

ドキュメント: foreachiflindexpackageprocsetstring

(注: コメントで言及されている 'Hoodiecrow' は私です。以前にそのニックネームを使用しました。)

于 2015-01-31T23:30:12.980 に答える
0

Hoodiecrowの答えに基づいて、私はそれをしました:

set Ouilist { 0000.0c 0001.42 0001.43 0001.63 0001.64 ... }

set Macs1 [open "IP-ARP.txt" r]

foreach a [split [read -nonewline $Macs1] \n] {

set macAddr [lindex $a 3]

set IP [lindex $a 1]

   if { [regexp {(172)\.([0-9]+)\.([0-9]+)\.([0-9]+)} $IP RealIP] } {

       regexp {([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])\.([0-9a-f])([0-9a-f])} $macAddr OuiPart
       if { $OuiPart in $Ouilist } {
          puts "$RealIP $macAddr\r
       }

   }

そうすれば、172 で始まるすべての IP と、Cisco および Checkpoint ベンダーの MAC アドレスを取得できます。

于 2015-02-03T22:20:29.440 に答える