シェルスクリプトで自ホストのIPアドレスを得るのにgetentを使う
どこの現場にも秘伝のたれ状態になったシェルスクリプトっていうのがあると思うのですけれども、ここの現場はみんなPHP使いなんでシェルスクリプト触りたくねえ、ていう状態のところに投入された僕が来ました。わしつい最近まで印刷屋さんだったんだけどもわしに任せてしまっていいんだろうか。
で、伝統を守り抜いたシェルスクリプトの中で自ホストに設定されたIPアドレスを得るコードがifconfigをこねくってeth0の所から得ようとしていたのですが、最近のサーバって必ずしもeth0が存在するってわけでもないのでこういう悪い習慣をここで断ち切ることになりました。
シェルスクリプトでIPアドレス得るために、シェルから使える環境変数で何か役立つものねえかなあと思っていたら、当然${HOSTNAME}
は鉄板なんで、こいつをgetent hosts
に入れてやればいいんでね、ていうアイディア。LinuxとFreeBSDの混在環境にあって、両方のOSでgetent
は使える技なので都合が良かった。CentOS 6なら結構基本なglibc-commonパッケージに入っているからもう既に使えるようになっていると思う。
$ getent hosts ${HOSTNAME} | awk '{print $1}' 133.242.132.137 $
getentっていうのはユーザ情報を取得するコマンドで、LDAPやNIS認証のときにそれぞれの認証データベースまで見に行けるのですけれども、hostsと指定すると、/etc/nsswitch.conf
の設定に従い、/etc/hosts
、DNSの順に調べに行くわけです。上記の入力で期待したIPアドレスが得られない場合は、/etc/hosts
の記述が不適切だっていうことになるかと思います。たとえば、CentOS 6とかだと、インストール時のホスト名設定でDNSで解決できないホスト名を入れると、IPv4とIPv6のlocalhostだけ登録され、ホストのIPとホスト名は/etc/hosts に記録されていないとか、そんな状態になります。
このシェルスクリプトでIPアドレスを取得するのを応用しますと、ターミナルエミュレータ(PuTTYとか)のタイトル部分に常にホストのIPアドレス表示するように出来ます。
export PROMPT_COMMAND='printf "\033]0;%s@%s(%s):%s\007" "${USER}" "${HOSTNAME}" `getent hosts ${HOSTNAME} | awk "{print \\$1}"` "${PWD/#$HOME/~}"'
おすすめです。