mac アドレス 検索 コマンドで2つの答えが返る理由
社内のネットワーク担当者にMACアドレスを伝えたら、そんな機器は見えていないと返ってきた。打ち間違いではない。macOSは同じWi-Fiの機器について、どのコマンドで訊くかによって別の値を返す。どちらも間違っていない。訊いている内容が少しずつ違うだけになる。mac アドレス 検索 コマンドで調べたときに何が起きているのかを、macOS 26.6.2 の実機で確かめた結果として整理する。
何のアドレスを探しているのかを先に決める
Macで「アドレス」と言うとき、まったく関係のない2つの仕事が混ざっている。1つはネットワーク機器としての識別番号で、機器登録やDHCPの割り当て表を見る担当者が求める値になる。もう1つはファイルの置き場所、つまりフルパスで、スクリプトに貼ったり、アップロードの画面で指定したり、相手に伝えたりするために要る値になる。
検索結果はこの2つを区別しないので、パスが欲しいのにネットワークのコマンドを叩いていた、という時間の使い方が起きる。以下では両方を扱う。驚くような挙動があるのはネットワークのほうなので、そちらから見る。
同じ機器に2つの値が返る
標準で入っている2つのコマンドに、同じWi-Fiの機器について訊いた結果がこうなる。
$ networksetup -getmacaddress Wi-Fi
Ethernet Address: 70:8c:f2:xx:xx:xx (Hardware Port: Wi-Fi)
$ ifconfig en0 | grep ether
ether 5e:65:19:xx:xx:xx
前者は機器に焼き込まれている値を返す。後者はいま実際にネットワークへ示している値を返し、初期設定ではネットワークごとのプライベートアドレスになる。system_profiler SPAirPortDataType の結果は後者と一致する。レジストリを直接読むと、2つが並んでいるのが見える。
$ ioreg -l | grep -i IOMACAddress
"IOMACAddress" = <5e6519xxxxxx>
"IOMACAddress" = <708cf2xxxxxx>
担当者に伝えた値が装置側に出てこないという事故は、ほぼこれになる。ifconfig で見た値、つまりプライベートアドレスのほうを送ってしまっている。機器登録のように長く使う値が欲しいなら networksetup -getmacaddress になる。いまルーターが何を見ているのかを追いたいなら ifconfig のほうが合う。
見た値がどちらなのかを1秒で見分ける
もう1回コマンドを打たなくても、値そのものから判別できる。先頭の1バイトの下から2番目のビットが「ローカルで作られたアドレス」を表す印になっている。立っていれば製造元に割り当てられた値ではなく、生成された値ということになる。
実務では、アドレスの2桁目の16進数だけを見ればよい。そこが 2、6、A、E のいずれかなら生成された値で、Macならほぼプライベートアドレスになる。先ほどの例では 70 の2桁目が 0 なので本来のハードウェアの値、5e は E なので生成された値になる。この見分けは誰が持ってきた値にも使えるので、チャットに貼られたアドレスがそもそも求めている種類の値なのかを、その場で判定できる。
この挙動はAppleが公開している仕様になる
勝手に変わっているのではなく、意図された動きとして書かれている。
デフォルトでは、プライバシー対策を強化するため、デバイスはWi-Fiネットワークごとに異なるMACアドレスを使い分けます。この一意のMACアドレスは、デバイスがそのネットワークに限って使うプライベートなWi-Fiアドレスとなります。 出典: support.apple.com
同じページには、Macでこの設定を切り替えられるのは macOS Sequoia 15 以降だと書かれている。設定は3つある。オフにするとハードウェアMACアドレスを使う。固定にするとそのネットワーク用のプライベートアドレスを1つ使い続ける。ローテーションにすると2週間ごとに別のプライベートアドレスへ切り替わる。
最後の1つは、問い合わせを立てる前に知っておく価値がある。1か月前に控えたアドレスが今日いきなり合わなくなっていても、誰も何も触っていない可能性があるためになる。MACアドレスでの認証を使っている社内ネットワークにつなぐなら、そのネットワークについてだけ設定をオフにしておくのが筋になる。
| コマンド | 返す値 | 向いている用途 |
|---|---|---|
| networksetup -getmacaddress Wi-Fi | ハードウェアの値 | 機器登録、申請書への記入 |
| ifconfig en0 | いま使っている値 | ルーターや装置に見えている値との突き合わせ |
| system_profiler SPAirPortDataType | いま使っている値 | ネットワーク名と並べて読みたいとき |
| arp -a | ほかの機器の値 | プリンタや画面のない機器を探すとき |
自分以外の機器のアドレスを調べる
インターフェイスの名前は機種や接続によって変わるので、en0 と決め打ちすると空振りする。実際に通信が出ている口を先に確かめる。
$ route -n get default
gateway: 192.168.1.1
interface: en7
この機体ではThunderboltのEthernetアダプタが刺さっているため、既定の経路は en7 を通っている。ここで ifconfig en0 を見ても、動いてはいるが使われていない口を眺めることになる。
ほかの機器については arp -a が、最近やり取りした相手を一覧で出す。各行に相手の名前かIPアドレス、そのハードウェアの値、どの口で見たかが並ぶ。一度も通信していない相手は出てこないので、先に対象へpingを打っておくのが手順になる。画面を持たないプリンタやカメラのアドレスを知りたいときは、これが現実的な道になる。
Wi-Fi以外の口も並んでいる
networksetup -listallhardwareports は、すべての口を機器名とアドレスの組で並べる。アダプタを付けているMacでは、思っているより一覧が長い。この機体ではThunderboltのEthernet、いくつかのアダプタの項目、そしてWi-Fiがそれぞれ別のアドレスを持って並んだ。
申請書に「MACアドレス」と書く欄が1つしかないとき、その機械が実際にどの口でつながるのかを分かっていないと、登録は済んだのにつながらないという状態になる。最初のコマンドが返した値を掴むのではなく、一覧を一度全部読むだけで決まる話になる。
ドッキングステーションを使っている場合は、意味を持つアドレスがMacではなくドック側のものになっていることがある。つまり別の席で使った瞬間に変わる。これは設定として書き留めておく価値がある。1年経つと、なぜあのノートは特定の部屋でしかつながらないのかを誰も説明できなくなるためになる。
もう1つのアドレス、つまりファイルのパス
ここからは後者の意味になる。ほとんどの場面は3つのコマンドで足りる。pwd はいまいる場所を出す。realpath は相対パスや入り組んだ書き方を、シンボリックリンクをたどって絶対パスに直す。
$ realpath tmp
/Users/admin/dev/Cursor/atsoho-blog/tmp
名前で探すのは mdfind になる。ディスクを歩き回るのではなくSpotlightの索引に訊くので、find なら時間のかかるボリュームでも一瞬で返る。
$ mdfind -onlyin ~/projects -name "chunks2"
$ mdfind "kMDItemFSName == 'WRITER-MAC.md'" -onlyin ~/projects
下の書き方は部分一致ではなく、ファイル名の完全一致になる。名前が短いときはこちらでないと結果が溢れる。1つのファイルについて索引が持っている情報は mdls で読める。検索に出てこないファイルの種類や大きさを、Spotlightがどう認識しているか確かめられる。逆向きには open -R があり、シェルで得たパスをFinderで選択状態にできる。ドラッグの手間なしに、コマンドの結果をそのまま画面上の項目に変えられる。
名前ではなく中身で探す
索引が持っているのは名前だけではない。中身で探すときも同じコマンドで、-name の代わりに属性を書く。
$ mdfind -onlyin ~/projects "kMDItemTextContent == '*ditto*'"
これはその語を含むファイルを返すのであって、その語を名前に付けたファイルを返すのではない。書類そのものを見つけるのと、昔その話題でラベルを付けたフォルダを見つけるのとの違いになる。属性の条件は組み合わせられるので、中身と種類と日付を1つの式にまとめられる。どんな属性が使えるかは、対象のファイルに mdls を掛ければ一覧で出る。覚えておくのではなく、その場で見るのが早い。
結果を次の処理へ渡すときには、1つだけ癖を付けておく。パスには空白が入るので、素直につなぐと最初の空白で壊れる。mdfind -0 は結果をヌル文字で区切り、xargs -0 が同じ形で読み戻すので、どんな名前でも通る。
$ mdfind -0 -onlyin ~/projects -name "report" | xargs -0 ls -l
Finderから持ってきたパスも同じになる。ファイルをターミナルの窓へドラッグすると、必要な記号を付けた形でパスが差し込まれる。手で打つより速く、間違いも減る。逆向きには open -R があり、シェルで得たパスをFinderで選択状態にできる。
検索しても何も返ってこないとき
確実に存在するファイルが mdfind で出てこないなら、そのボリュームが索引されていない可能性が高い。状態はコマンドで読める。
$ mdutil -a -s
/:
Indexing disabled.
/System/Volumes/Data:
Indexing enabled.
/Volumes/BAND 1.10.17:
Indexing disabled.
3つのボリュームで答えが割れている。システム側が無効なのは通常の状態で、実害はない。困るのは外付けのほうになる。無効のままだと、そこに入っているものは何を検索しても永久に出てこないし、理由を説明するエラーも出ない。外付けドライブはこの状態で届いて、そのまま使われ続けることが多い。
分かってしまえば、あとは選ぶだけになる。索引を有効にするか、索引をあきらめて find で探すかのどちらかになる。ディレクトリを直接読む find は索引の状態と無関係に動く。どちらなのか分からないまま試し続けるのが、いちばん時間を失う形になる。
2つの意味が同じ形で失敗する
言葉が重なっているだけの話に見えるが、実務では同じ形の失敗を生む。どちらのアドレスも、ターミナルから値を写して別の場所へ貼るために使われる。多くは人へのメッセージになる。そして両方とも、同じ静かな壊れ方をする。読んだ時点では正しく、使われる時点では違っている。
プライベートWi-Fiアドレスは、ネットワーク側が切り替えるまでは正しい。ファイルのパスは、そのファイルが動くまでは正しい。案件の途中でファイルは何度も動く。どちらの場合も、受け取った側にはもっともらしい値が届き、失敗はあとから「つながらない機器」や「どこにも行かないリンク」として現れる。
対処はどちらも同じになる。いまの値ではなく、変わらない側の値を送る。ネットワークなら ifconfig の生の値ではなく networksetup のハードウェアの値になる。ファイルなら、動かない場所を基準にしたパスにして、見つけた時点ではなく送る時点で本当にそこにあるかを確かめる。realpath がエラーを出さずに返ることがその確認になり、コマンド1つで済む。
探す速さが効いてくるのもここになる。名前から1秒で場所を出せる人は、パスをメモに溜めなくなる。溜めていないパスは古くならない。ネットワークの側も同じで、2つのコマンドをその場で打てるなら、一度控えた答えを1年信じ続ける必要がなくなる。
手元の道具の配置から見えること
ここまでのコマンドは、どれも単体では数秒で終わる。時間がかかっているのは、フォルダを見ている窓とコマンドを打つ窓のあいだを行き来する部分になる。索引の状態を確かめるだけの mdutil -a -s が「別の作業」に感じられるのは、その往復があるためになる。
フォルダとターミナルとAIが同じ窓にある状態なら、探している場所を見ながらその場で索引の状態を確かめ、必要なら探し方を切り替えられる。何ができるのかはできることに、外出先から続きを扱う方法はiPhone・iPadから続きをに、費用の考え方は料金にまとめてある。
コマンドを増やす前に、まず何のアドレスを探しているのかを決める。それだけで、返ってきた2つの値のどちらを送ればよいかは自動的に決まる。
よくある質問
ネットワーク担当者に伝えるのはどちらの値ですか?
networksetup -getmacaddress が返す値になる。機器に焼き込まれたハードウェアの値で、変わらないためになる。ifconfig が返すのは通常そのネットワーク用のプライベートアドレスで、ローテーションの設定なら2週間ごとに変わる。その値で登録すると、ある日突然つながらなくなる。
先月控えたアドレスが合わなくなったのはなぜですか?
プライベートWi-Fiアドレスが切り替わった可能性が高い。Appleは2週間ごとに別のプライベートアドレスへ移る「ローテーション」という設定を公開しており、セキュリティの弱いネットワークや無い場合の初期値になっている。Macの側で何かを変えたわけではない。そのネットワークについて設定をオフにすれば、ハードウェアの値を使うようになる。
プリンタなど画面のない機器のアドレスはどう調べますか?
先に通信してから一覧を読む。相手のIPアドレスにpingを打つと手元の表に載るので、arp -a でハードウェアの値と、どの口で見えたかが分かる。最近やり取りしていない相手は表に出てこないため、pingが先になる。
ファイルが確かにあるのに検索で出てこないのはなぜですか?
そのボリュームが索引されていない可能性が高い。mdutil -a -s でマウント中のボリュームごとの状態が出るが、外付けドライブは無効になっていることが多い。無効のあいだ索引を使う検索は何も返さず、エラーも出さない。find はディレクトリを直接読むので、索引の状態に関係なく探せる。