読者です 読者をやめる 読者になる 読者になる

平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

Macとnon-Macな*nixで共通のシェルスクリプト内でホストの名前解決をする

engineer

タイトルの通りです。

*nixの便利コマンドgetentを使うと、こういう感じで/etc/hostsを見たりDNSサーバに問い合わせたりしつつ名前解決してくれる。(getent自体は名前解決専用のツールではないので、他にもいろいろな情報を引くことが出来るけど今回は割愛)

$ getent hosts idolmaster.jp
52.192.154.178    idolmaster.jp

便利なので、シェルスクリプトの中でこういう感じに書いてホスト名からIPを引いてたりする。

host_ip=$(getent hosts $host | awk '{ print $1; exit }')

しかしながらMacにはgetentはない。適当にインターネットを検索すると、MacだとDirectory Serviceが同様の役割を担っているようで、dscacheutilを使うと引くことが可能そう。
apple.stackexchange.com

$ dscacheutil -q host -a name idolmaster.jp
name: idolmaster.jp
ip_address: 52.192.154.178
ip_address: 54.238.242.145

一応試してみたけど/etc/hostsも参照できてそう。

$ cat /etc/hosts | grep astjtest
10.XXX.XXX.XXX astjtest002.host
$ dscacheutil -q host -a name astjtest002.host
name: astjtest002.host
ip_address: 10.XXX.XXX.XXX

ここからipだけほしければ、getentの時と同じようにawkすればよくて、

host_ip=$(dscacheutil -q host -a name $host | grep ip_address | awk '{ print $2; exit }')

結局、Macと非Macの両方で動くようにしたければこういう感じでよいのかな、というようになった。

if type dscacheutil > /dev/null ; then # Mac OS doesn't have getent and has dscacheutil instead
    host_ip=$(dscacheutil -q host -a name $host | grep ip_address | awk '{ print $2; exit }')
elif type getent > /dev/null ; then
    host_ip=$(getent hosts $host | awk '{ print $1; exit }')
fi

オチなし。