Origami Devices

USB充電本作ったりしてます。

セットアップした直後の Raspberry Pi の IP アドレスを知りたい

またの名を「LANの中で生きているマシンをお手軽に一発チェックしたい」。

キーボード(とマウス)をつないでセットアップする人はともかく、キーボードとディスプレイの接続なしで Raspberry Pi をセットアップしたい、という方も少なからずいらっしゃると思います。ただ、Raspbian をインストールした直後の Raspberry Pi は、DHCP で IP アドレスを取得するため、Raspberry Pi に割り振られた IP アドレスを探るのが一苦労という方も少なくないように思います。 *1

特に、アドレスを配る DHCP サーバが動いているブロードバンドルーターにリース中の IP アドレスを一覧で表示する機能がない場合はわりとめんどくさいです。いちいち ping コマンドを手動で打って確認、とか正直言ってやってられません。

というわけで、こういうのは自動でやってもらいましょう。

fping

fping というコマンドがあります。CentOS の場合は epel リポジトリにいます。

$ fping -g 8.8.8.0/24 -a
8.8.8.8 is alive

範囲を指定して ping を打ち、その結果を表示してくれます。この fping、Windows にもだいたい同じ機能をもったコマンドとして移植?されています。

Fping for windows: fast ping with great options

オプションの指定方法、特に ping を打つ範囲の指定方法はちょっと異なります。Windows 版 fping だとマスクでの指定は出来ないみたい。*2

C:\fping\fping.exe -p -g 192.168.0.1/192.168.0.10

Fast pinger version 3.00
(c) Wouter Dhondt (http://www.kwakkelflap.com)

Pinging multiple hosts with 32 bytes of data every 1000 ms:

Reply[2] from 192.168.0.2: bytes=32 time=0.9 ms TTL=64
192.168.0.9: request timed out
192.168.0.1: request timed out
192.168.0.6: request timed out
192.168.0.4: request timed out
192.168.0.8: request timed out
192.168.0.10: request timed out
192.168.0.3: request timed out
192.168.0.5: request timed out
192.168.0.7: request timed out

Ping statistics for multiple hosts:
        Packets: Sent = 10, Received = 1, Lost = 9 (90% loss)
Approximate round trip times in milli-seconds:
        Minimum = 0.9 ms, Maximum = 0.9 ms, Average = 0.9 ms

どうも -t オプションや -w オプションが効いているのかどうかちょっと怪しくて結構時間が掛かりますが、 -p を指定すれば順番ではなくて一斉に実行してくれるため、/24 くらいの範囲を指定しても数秒掛からず完了します。*3 ただ、応答結果が順不同になるのはご愛嬌。*4

あと、 CentOS 向け fping だと、-a オプション(ping応答があったターゲットのみ表示する)があるのですが、これに相当するものが Windows 版にはないようです。なので末尾に request timed out のメッセージがずらりと並んでしまうのですが、これ消す方法ないんですかね…

*1:Raspbian で avahi が最初から起動してればいいんですが、デフォルトでは入っていません

*2:CentOS版だと 192.168.0.1/24 または 192.168.0.1 192.168.0.255 みたいな書き方になる

*3:逆にこの Windows 版 -p に相当する機能が CentOS 向けに見当たらない…これ便利なんだけど。

*4:というより、管理者権限がないユーザが -p 抜きで fping 実行するといちいち "socket() - An attempt was made to access a socket in a way forbidden by its access permissions." と出る上に1秒ずつ順繰りに実行するのでとても使えたもんじゃない