普段Linuxを使っている方は、ネットワーク設定を確認するときにifconfig -a
を躊躇なく(時にはrootで!)実行しているのではないでしょうか。
ifconfig -a
の持つ意味
SunOS/Solarisではifconfig -a
は若干違う意味を持つので注意が必要です。
-a
Apply the command to all interfaces of the specified address family. If no address family is supplied, either on the command line or by means of /etc/default/inet_type, then all address families will be selected.
Oracle社のマニュアルより
上記にあるように、commandをすべてのinterfaceにapplyするということだけを意味しています。interfaceのステータスを表示する、ということに限定はしていません。
つまり、例えば以下のようなcommandを入力した場合、
ifconfig -a down
そのホストのすべてのinterfaceがダウンすることになってしまいます。-a
の後ろにcommandを追加した途端に、危険なcommandへと変貌してしまうのです。
やってしまいそうなミス
また、SunOS/SolarisではIPv4アドレスが設定されているinterfaceのステータスを確認する際に以下のようなcommandを実行しますが、
ifconfig -a4
これを間違って、
ifconfig -a 4
と入力してしまうと、すべてのinterfaceのアドレスが、0.0.0.4というIPv4アドレスに設定されることになってしまいますIPアドレス表記。
MacやLinuxではどうか
一方、MacOSXやLinuxのmanでは以下のように書かれています。
if a single -a argument is given, it displays the status of all interfaces, even those that are down. Otherwise, it configures an interface.
ここでは明示的に、すべてのinterfaceのステータスを表示する、ということが書かれており、間違って全てのinterfaceの設定を変更してしまう、ということは無さそうです。
どう対策するか
そもそも、interfaceのステータス表示させるためにはroot権限は不要ですので、不用意にrootで作業をしないという基本ルールでこのようなミスは防ぐことができます。
IPアドレス表記
このように数値をIPアドレスとして解釈してしまうのは、IPv4アドレスを192.168.0.1
のようなRFC3986で規定されたドット表記だけではなく、3232235521
という数値表記であっても許容するように、gethostbyname()
やinet_aton()
といった関数で実装されているためです。SunOS/Solarisだけではなく、LinuxやMacOSXでも数値表記は可能となっています。
$ ping 3232235521
PING 3232235521 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=3.197 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.590 ms
^C