今回はGo言語でインターフェースの
MACアドレスを取得していきます。
C++であれば、ioctlシステムコールで
Macアドレスを取得できます。
ifreq構造体にその値が格納されます。
それでは実際に取得していきましょう。
まずは実行結果です。

ソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import ( "fmt" "net" ) func main(){ ifr, err := net.InterfaceByName("VPN - VPN Client") if err != nil{ fmt.Errorf("[-]Fail to get Interface: %v", err) } fmt.Println(ifr.HardwareAddr) } |
たったこれだけで取得ができます。
余分な箇所は省くために、
インターフェース名は、
ソース内で指定しています。
コマンドライン引数で指定したい
という場合は、flagパッケージを
使用すれば実装出来ます。
インターフェース名から
インターフェース情報を取得するには、
InterfaceByName関数を使います。
netパッケージ内で定義されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
func InterfaceByName(name string) (*Interface, error) { if name == "" { return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errInvalidInterfaceName} } ift, err := interfaceTable(0) if err != nil { return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err} } if len(ift) != 0 { zoneCache.update(ift, false) } for _, ifi := range ift { if name == ifi.Name { return &ifi, nil } } return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errNoSuchInterface} } |
InterfaceByName関数の戻り値は、
Interface構造体です。
Interface構造体もnet内で定義されています。
1 2 3 4 5 6 7 8 9 10 |
// Interface represents a mapping between network interface name // and index. It also represents network interface facility // information. type Interface struct { Index int // positive integer that starts at one, zero is never used MTU int // maximum transmission unit Name string // e.g., "en0", "lo0", "eth0.100" HardwareAddr HardwareAddr // IEEE MAC-48, EUI-48 and EUI-64 form Flags Flags // e.g., FlagUp, FlagLoopback, FlagMulticast } |
指定したインターフェース名の情報を
Interface構造体の各メンバに格納します。
あとはHardwareAddrメンバを出力するだけです。
私は、Windows環境で実行しました。
ipconfig -all
もしくは、
netsh interface ip show interface
どちらかをタイプすれば、
インターフェース名を取得できます。

こんな感じです。
InterfaceByName("イーサネット")
と指定してもしっかり取得できます。
IndexからMACアドレスも取得できます。
その場合はIndexByIndex関数を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
func InterfaceByIndex(index int) (*Interface, error) { if index <= 0 { return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errInvalidInterfaceIndex} } ift, err := interfaceTable(index) if err != nil { return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err} } ifi, err := interfaceByIndex(ift, index) if err != nil { err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err} } return ifi, err } |
例えば私の環境では、
netsh interface ip show interfaceより
イーサネットのインデックス番号が14
ということが分かっているので、
IndexByIndex(14)
と書き換えればいいだけです。
以上です。
シンプルに取得できますね。
最後まで読んでいただきありがとうございました。