アンドロイドは、Linuxをベースに作られており、開発などで利用する場合、USB接続したパソコンなどからシェルを使って操作ができるようになります。このためには、Android SDKをインストールしておき、「adb shell」コマンドを使います。

このとき、コンソール画面(Windowsならばコマンドプロンプト)で実行されているシェルは、アンドロイド側で動作しています。このため、ここではLinux用に作られたコマンドを使います。ただし、アンドロイドが標準で持っているコマンドは、一般的なLinux(正確にはLinuxディストリビューション。Linuxカーネルと各種のオープンソースプロジェクトの成果などを組み合わせてオペレーティングシステムを構築したもの)とはちょっと違っています。まず、コマンドが限定されていること、また、コマンドによっては簡易版になっていることなどです。また、アンドロイド固有のコマンドもあります。

基本的には、Linuxを使った経験があれば、あとはインターネット検索などで調べることで、このシェルを使った作業ができるでしょう。また、過去にUnixを使ったことがあれば、調べることは少なくありませんが、ある程度時間をかければ作業できるようになるでしょう。Linuxは、Unixを手本にしているため、コマンドの多くがUnix由来ですが、現在では、UnixよりもLinuxのほうが普及しているため、コマンド体系も変わりつつあります。

この連載では、ときどき、シェルから利用するコマンドなどについて解説していくことにします。今回は、ネットワーク関係のコマンドを見ていくことにしましょう。

Unixの頃から、pingやnetstat、routeなどのコマンドが使われてきており、Windowsなどの他のシステムでも一部のコマンドが、ほぼそのまま移植されています。こうしたネットワーク関係のツールは、ネットワーク接続でのトラブルのときに使うものですが、GUIを使った操作が可能でスマートフォンとして完成されているアンドロイドでは、トラブル時にこうしたツールを使う機会はそれほど多くありません。たとえば、無線LANに接続できないなどのトラブルはGUIのみで解決が可能で、そもそもネットワーク側がトラブルを抱えているなら、アンドロイドでそのトラブル対策を行わねばならない場面はすくないでしょう(不可能ではありませんが)。

どちらかというと、特殊なことをしたいときにコマンドを使って設定するなどの作業が中心になります。それでも、こうしたコマンドの大半が、ipアドレスやルーティングテーブルなど対象とするパラメーターを表示する機能があったり、ネットワークをテストすることができるため、まったく利用しないわけでもありません。

Linuxのほうでは、ネットワーク関係のツールは、「iproute2」と呼ばれるパッケージが主流になり、従来のnet-toolsパッケージは標準からは外れつつあります。アンドロイドもiptoute2が採用されていますが、従来コマンドも残っています(表01)。というのは、従来コマンドは、net-toolsのパッケージから作られているのではなく、toolboxと呼ばれる別のパッケージになっているからです。

■表1: android 4.4.4のネットワーク関連シェルコマンド
net-tools iproute2 説明
cmd toolbox cmd android
arp × ip neigh アドレス解決プロトコルの制御、表示
ifconfg ip addr/link ネットワークインターフェースの設定、表示
ipmaddr × ip maddr マルチキャストアドレスの設定、表示
iptunnel × ip tunnel トンネルプロトコルの設定、表示
route △※1 ip route ルーティングテーブルの設定、表示
nameif × ifrename × ネットワークインターフェース名の変更
mii-tool × ethtool × メディア独立インターフェースの設定、表示
vconfig × ip link × VLANの設定
netstat ss × ネットワークソケットや接続状態の表示
※1:簡易版

アンドロイドのようなPCに比べると記憶領域が小さい機器では、占有ファイルサイズを小さくするため、1つのバイナリプログラムの中に複数のコマンドを入れる「BusyBox」方式が使われることが少なくありません。各コマンドはそれぞれのシンボリックリンクから起動することで起動できます。たとえば「ls」という名前でtoolbox実行ファイルを指すシンボリックリンクを作り、ここから起動すると、toolbox内のlsコマンドが実行されます。

toolboxもBusyBox方式となっており、提供されるコマンドが全部1つの実行ファイルの中に組み込まれています。このため、ifconfigやrouteコマンドも他のコマンドと同じ実行ファイルの中にあるため、外すメリットがあまりありません。また、こうした「著名」なnet-toolsコマンドを直接呼び出している他のプログラムやスクリプトがあるかもしれません。システムの互換性を考えると、代用となるipコマンドが出来たからといってすぐに廃止することもできません。ちなみにtoolboxはandroid 1.6(Donut)からあるのに対してiproute2が組み込まれたのはandroid 2.2(Froyo)からです。

また、アンドロイドのシェルでは、iproute2からはipコマンドだけが入っています。ipコマンドは比較的大規模なコマンドで、net-toolsの複数のコマンドを代用します。このため、どうしても入れる必要があるのに対して、他のiproute2コマンドは、Linuxのようなシステムでは必須でも、アンドロイドのようにネットワークにはクライアントとして接続するような場合にはほとんど使う必要がないものだからだと思われます。

ipコマンドの使いかた

ipコマンドは、引数に「オブジェクト」指定を付けることでいくつかの機能を実行できる比較的大きなコマンドです。実際、arpやrouteといった5つのnet-toolsコマンドを代用しています。

まず、基本的な書式ですが、

ip [ OPTIONS ] OBJECT { COMMAND | help }

となっていて、アンドロイド4.4.3に搭載されているipコマンドには、(表02)のようなオブジェクトがあります。この後にコマンドを置いて、機能を実行しますが、基本的なコマンドの単語(showやadd、deleteなど)は、あるもののコマンドは、オブジェクトごとに定義されていて、使い方はそれぞれを覚えるしかありません。

■表2: android 4.4.4のipコマンドのOBJECT
OBJECT 意味
link ネットワークデバイス管理
addr プロトコルアドレス管理
addrlabel IPv6アドレスラベル管理
route ルーティングテーブル管理
rule ルーティングポリシー管理
neigh ARP/NDISC管理
ntable ARP/NDISCキャッシュ管理
tunnel トンネリング管理
tuntap TUN/TAPデバイスの管理
maddr マルチキャスト管理
mroute マルチキャストルーティング管理
mrule マルチキャストルーティングポリシー管理
monitor デバイスの状態管理
xfrm IPsecポリシー管理
netns ネームスペース管理
l2tp L2TP管理

まず「ip help」で全般的な説明が表示され、さらに「ip OBJECT help」で各オブジェクト別にコマンドの説明が表示されます。ただし、それぞれのコマンドの書式で使い方はわかりますが、それぞれがどのような意味を持つのかは、各オブジェクトがTCP/IPやその実装の中でどのような意味を持っているのかを理解していなければなりません。

ipコマンドのヘルプ。オブジェクトを指定してhelpサブコマンドを続けることでオブジェクト別のヘルプを表示できる

このあたりの解説は、詳細は、各種のネットワーク関連の書籍に譲ることとして、ここでは、よく使われていた「arp」、「ifconfig」、「route」コマンドの代用としての使い方に絞って解説します。

「arp」コマンドは、macアドレスとIPアドレスの対応を探すのに使われることが多く、その代用になるのは「ip neigh show」です。このコマンドラインで、IPアドレス、デバイス名などに加えてMACアドレス(デバイスアドレス)を表示してくれます。なお最後の「show」は省略することもできます。

ip neighコマンドのヘルプ。showでMACアドレスとIPアドレスの対応表を表示

ip neigh showの実行結果。これまでにアクセスしたIPアドレス(プロトコルアドレス)とMACアドレス(リンクアドレス)が表示される

「ifconfig」は、おもに自分のIPアドレスやMACアドレスを調べる場合に使うことがあります。もちろん、管理用途としてはネットワークインターフェースの管理を行うものなので、ネットワークデバイスを止めるといった使い方もあるのですが、アンドロイドの場合、これはGUI側で管理しているため、このコマンドを直接使ってネットワークインターフェースを管理することは少ないでしょう。もっとも開発用途などで、ネットワークが止まったときにどうなる? みたいな使い方はあるでしょうが。

単純に「ip addr show」とすれば、すべてのネットワークデバイスの情報を表示してくれます。ただし、あまりに表示される量が多いので、アンドロイドの場合には無線LAN(デバイス名はwlan0)に限定して「ip addr show dev wlan0」としたほうがいいでしょう。

ip addrのヘルプ。showサブコマンドでインターフェースに割り当てられているプロトコルアドレスを表示。「dev IF名」で表示するデバイスを限定できる

ip addr show dev wlan0で無線LANのアドレスを表示させたところ

「route」コマンドは、パケットのルーティングを管理するためのコマンドで、使い方としては、VPNなど複数のネットワーク経路がある場合にどちらを優先するのかなどを指定したり、ローカルネットワークに複数のルーターがあるなどの特殊なネットワーク構成の場合にルーティングテーブルを修正するなどに使われます。なお、routeコマンドは、アンドロイドにそのまま残っていますが、経路の追加「add」サブコマンドのみが有効で、経路テーブルを表示したり、経路の削除や修正はできません。

いわゆる「route print」のようなルーティングテーブルの表示ならば「ip route list」を使い、後に「table テーブルID」を付けることで、表示されるルーティングテーブルを限定することが可能です。省略したときには、「table main」が指定されたのと同じになります。

ip routeのヘルプ。listサブコマンドでルーティングテーブルを表示するが、「table テーブルID」で表示するテーブルを指定する

ip route list table mainの実行結果

関連リンク

連載バックナンバーはこちら