M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

シェルスクリプトで自ホストのIPアドレスを得るのにgetentを使う

どこの現場にも秘伝のたれ状態になったシェルスクリプトっていうのがあると思うのですけれども、ここの現場はみんなPHP使いなんでシェルスクリプト触りたくねえ、ていう状態のところに投入された僕が来ました。わしつい最近まで印刷屋さんだったんだけどもわしに任せてしまっていいんだろうか。

で、伝統を守り抜いたシェルスクリプトの中で自ホストに設定されたIPアドレスを得るコードがifconfigをこねくってeth0の所から得ようとしていたのですが、最近のサーバって必ずしもeth0が存在するってわけでもないのでこういう悪い習慣をここで断ち切ることになりました。

シェルスクリプトIPアドレス得るために、シェルから使える環境変数で何か役立つものねえかなあと思っていたら、当然${HOSTNAME}は鉄板なんで、こいつをgetent hosts に入れてやればいいんでね、ていうアイディア。LinuxFreeBSDの混在環境にあって、両方のOSでgetentは使える技なので都合が良かった。CentOS 6なら結構基本なglibc-commonパッケージに入っているからもう既に使えるようになっていると思う。

$ getent hosts ${HOSTNAME} | awk '{print $1}'
133.242.132.137
$ 

getentっていうのはユーザ情報を取得するコマンドで、LDAPNIS認証のときにそれぞれの認証データベースまで見に行けるのですけれども、hostsと指定すると、/etc/nsswitch.confの設定に従い、/etc/hostsDNSの順に調べに行くわけです。上記の入力で期待したIPアドレスが得られない場合は、/etc/hosts の記述が不適切だっていうことになるかと思います。たとえば、CentOS 6とかだと、インストール時のホスト名設定でDNSで解決できないホスト名を入れると、IPv4IPv6localhostだけ登録され、ホストの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/~}"'

おすすめです。