mac アドレスをローカルで検索するスクリプトを Claude に書いてもらう

時々 mac アドレスから機器のベンダーを調べたいときがあります、例えば DHCP で割り当てられたアドレスがどの機器なのかを知りたいときなんかです。そんなときはいつもベンダールックアップできる Web サイトを使用していたのですが、ターミナルからできたら便利かもしれないと思い Claude に聞いてみました。

先に結果から載せますが、こういう関数を定義すれば OK でした。

mac_lookup() {
    for mac in "$@"; do
        vendor_code=$(echo "$mac" | tr ':' '-' | cut -d'-' -f1,2,3)
        echo "MAC: $mac"
        grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
        echo
    done
}

これを ~/.bashrc に追記するなり、別ファイルにして source xxx としてもいいです。

oui.txt は LM22 (多分 Ubuntu 系も同じパス) なので他の Linux では少し異なるかもしれない。

使い方は、 mac_lookup xx:xx:xx:yy:yy:yy みたいな感じでコマンド叩けばいい。区切り文字は : か – のいずれかで必須です。中で grep しているだけなので全桁なくても動きます。
想定しているのは、上位6桁ですが、それ以外の一部分を検索することはないだろう。

Claude とのセッション

ほぼコードは書いていなくて数分で完成まで至ったのはちょっと感動。

以下は Claude とのセッションの様子。

Q: linux のターミナルで mac アドレスからベンダー情報をルックアップすることができるコマンドはある?

Claude: はい、macchanger というツールを使うことができます:

sudo apt install macchanger
macchanger -l | grep "開始の3バイト"

または、ieee-oui-lookup-list パッケージを使う方法もあります:

sudo apt install ieee-oui-lookup-list
grep "MACアドレスの最初の6文字" /usr/share/ieee-oui/oui.txt

例えば、MACアドレスが 00:11:22:33:44:55 の場合:

grep "00:11:22" /usr/share/ieee-oui/oui.txt

これらのツールはインストールが必要ですが、実際に試してみましょうか?

Q: ubuntu をつかっているのだけど、ieee-oui-lookup-list じゃなくて ieee-data じゃない?

Claude: ご指摘ありがとうございます。その通りです!

Ubuntuでは ieee-data パッケージを使います:

sudo apt install ieee-data
grep "MACアドレスの最初の6文字" /usr/share/ieee-data/oui.txt

例えば:

grep "00:11:22" /usr/share/ieee-data/oui.txt

私の以前の回答は間違っていました。正確な情報を共有できなかったことをお詫びします。

Q: : は – に変えないとだめじゃない?

Claude: はい、その通りです!申し訳ありません。

ieee-dataのデータベースでは、MACアドレスのフォーマットはハイフン(-)を使用します:

grep "00-11-22" /usr/share/ieee-data/oui.txt

コロン(:)からハイフン(-)に変換する必要があります。trコマンドを使って変換することもできます:

echo "00:11:22" | tr ':' '-' | xargs -I{} grep {} /usr/share/ieee-data/oui.txt

ご指摘ありがとうございます。より正確な情報をお伝えできました。

Q: もう少し改良してほしい。改良点は、フルレングスの mac アドレスを入力したらoui.txt をルックアップするようにして欲しい。

  • dc:a6:32:72:ef:e9 のようなマックアドレスを入力する
  • : を除いたベンダー部の上位6桁をルックアップする
  • アルファベットは大文字、小文字の両方を許容する
  • : の替わりに – が入力されることもある。

Claude: そうですね、それら全ての要件を満たすスクリプトを作成しましょう:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスを受け取り、
    # 最初の6文字(ベンダーコード)を抽出して大文字に変換
    vendor_code=$(echo "$1" | tr ':' '-' | tr '[:lower:]' '[:upper:]' | cut -d'-' -f1,2,3 | tr -d ':' | tr -d '-')
    
    # 2文字ずつハイフンで区切って検索
    formatted_code=$(echo $vendor_code | sed 's/./&/2;s/./&/5' | tr ' ' '-')
    
    grep -i "$formatted_code" /usr/share/ieee-data/oui.txt
}

# 使用例
mac_lookup "dc:a6:32:72:ef:e9"
# または
mac_lookup "DC-A6-32-72-EF-E9"

このスクリプトは:

  • コロン(:)またはハイフン(-)で区切られたMACアドレスを受け付け
  • 大文字小文字を問わず
  • 最初の6文字(OUI部分)を抽出
  • 適切なフォーマット(XX-XX-XX)に変換してルックアップ

これを.bashrcや.zshrcに追加して使うことができます。試してみましょうか?

いい感じだけど、不要な処理があるので指摘してみる。

Q: grep -i しているので tr で大文字変換は不要なんじゃない?

Claude: そうですね!ご指摘ありがとうございます。grep -iで大文字小文字を区別しない検索をしているので、tr ‘[:lower:]’ ‘[:upper:]’は不要です。
シンプルになったバージョンを作りましょう:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスから
    # 最初の6文字(ベンダーコード)を抽出
    vendor_code=$(echo "$1" | tr ':' '-' | cut -d'-' -f1,2,3 | tr -d '-')
    
    # 2文字ずつハイフンで区切って検索
    formatted_code=$(echo $vendor_code | sed 's/./&/2;s/./&/5' | tr ' ' '-')
    
    grep -i "$formatted_code" /usr/share/ieee-data/oui.txt
}

より簡潔で効率的になりました。

Q: cut -d の後の tr -d ‘-‘ も不要だと思う

Claude: そうですね!さらにシンプルにできます:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスから
    # 最初の6文字(ベンダーコード)を抽出
    vendor_code=$(echo "$1" | tr ':' '-' | cut -d'-' -f1,2,3)
    
    grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
}

cut -d’-‘ -f1,2,3で既にXX-XX-XXの形式で取得できているので、フォーマットの変換も不要でした。無駄な処理を省いてよりシンプルになりました。

Q: 更に改良して、複数のマックアドレスを一度に入力できない?

Claude: はい、複数のMACアドレスを処理できるように改良しましょう:

mac_lookup() {
    for mac in "$@"; do
        vendor_code=$(echo "$mac" | tr ':' '-' | cut -d'-' -f1,2,3)
        echo "MAC: $mac"
        grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
        echo
    done
}

使い方:

mac_lookup "dc:a6:32:72:ef:e9" "00:11:22:33:44:55" "aa:bb:cc:dd:ee:ff"

この改良版では:

  • 複数のMACアドレスをスペース区切りで入力可能
  • 各MACアドレスに対して元のアドレスを表示してから結果を表示
  • 見やすいように各結果の間に空行を挿入

いかがでしょうか?

こんなふうに、大雑把な指示でもわりといい感じでスクリプトを完成させられたのは便利だった。

どうでもいいけど、Claude の実行結果をワードプレスにコピペするの結構だるかった。何かいい方法ないだろうか?