host と hostname コマンドの違い

以前、aptとapt-getの違いについて調査しました。今回はhostとhostnameの違いについて調査しました。

host と hostname コマンドの違い

hostコマンドはDNSを使用して名前解決を行います。DNSのみを利用するため/etc/hostsに記載されている内容は無視されます。例えば「www.yahoo.co.jp」を引数にすると

$ host www.yahoo.co.jp
www.yahoo.co.jp is an alias for edge12.g.yimg.jp.
edge12.g.yimg.jp has address 182.22.16.251

と表示されます。ここで/etc/hohstに以下を追加してからhostコマンドを打ちこんでも同様の結果が得られます。

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

1.1.1.1     www.yahoo.co.jp
$ host www.yahoo.co.jp
www.yahoo.co.jp is an alias for edge12.g.yimg.jp.
edge12.g.yimg.jp has address 182.22.16.251

差分をみるためにpingコマンドを打ってみると以下のように「1.1.1.1」を引っ張ってきます。これはpingコマンドは/etc/nsswitch.confの「hosts:」に記載された順序で名前解決をするためです。

$ ping www.yahoo.co.jp
PING www.yahoo.co.jp (1.1.1.1) 56(84) bytes of data.
64 bytes from www.yahoo.co.jp (1.1.1.1): icmp_seq=1 ttl=54 time=5.01 ms

参考までに/etc/nsswitch.confの内容は以下となります。

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files
group:          files
shadow:         files
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

次にhostnmaeコマンドです。hostnameコマンドは「現在のホスト名を表示する機能」と「一時的にホスト名を変更する機能」を有します。「一時的に」とは「再起動する」と元のホスト名に戻るという意味になります。

$ hostname
raspi4
$ cat /proc/sys/kernel/hostname 
raspi4
$ sudo hostname raspi5
$ hostname
raspi5
$ cat /proc/sys/kernel/hostname 
raspi5
$ sudo reboot -n
・・・再起動・・・
$ hostname
raspi4
$ cat /proc/sys/kernel/hostname 
raspi4

では恒久的にホスト名を変更するにはどうしたらよいか?再起動してもホスト名がもとに戻らないようにするにはどうしたらよいか。/etc/hostnameファイルを編集します。

$ hostname
raspi4
$ cat /etc/hostname 
raspi4
$ sudo sh -c 'echo raspi5 > /etc/hostname'
$ cat /etc/hostname 
raspi5
$ hostname
raspi4
$ sudo reboot -n
・・・再起動・・・
$ hostname
raspi5