たまに、複数のDNSサーバに複数のドメインやIPアドレスの名前解決の結果を取得したいことがある。 要はdigを複数のサーバに対して複数の引数で連続でバーっと雑に実行したいということがあった。ので、bash functionを作った(昔に)。

本当は並列でバーっと処理するように書いたほうが良かったのかもしれないが、そんなに頻繁に実行しないだろってことでシングルになっている。

結構頻繁に使うので、自分のdotfilesにも組み込んでる。

# color code
export COLOR_RED=$'\E[0;31m'
export COLOR_GREEN=$'\E[0;32m'
export COLOR_ORANGE=$'\E[0;33m'
export COLOR_BLUE=$'\E[0;34m'
export COLOR_PURPLE=$'\E[0;35m'
export COLOR_CYAN=$'\E[0;36m'
export COLOR_LGRAY=$'\E[0;37m'
export COLOR_DGRAY=$'\E[1;30m'
export COLOR_LRED=$'\E[1;31m'
export COLOR_LGREEN=$'\E[1;32m'
export COLOR_YELLOW=$'\E[1;33m'
export COLOR_LBLUE=$'\E[1;34m'
export COLOR_LPURPLE=$'\E[1;35m'
export COLOR_LCYAN=$'\E[1;36m'
export COLOR_WHITE=$'\E[1;37m'
export COLOR_NONE=$'\E[0m'

ddig() {
  # カラーコードの設定
  local COLOR_TARGET_START
  local COLOR_DNS_START
  local COLOR_END
  if [ -t 1 ]; then
    COLOR_TARGET_START=${COLOR_LGREEN}
    COLOR_DNS_START=${COLOR_CYAN}
    COLOR_END=${COLOR_NONE}
  fi

  # 引数の取得
  local args=$(fmt -1 <<<${@})                                     # 引数を一括で抽出
  local target=$(echo "${args}" | grep -v -e '^@' -e '^-' -e '^+') # ターゲットとなるホスト名を抽出
  local dns=$(echo "${args}" | grep '^@')                          # dnsサーバ(@hogehoge)の指定のみ抽出
  local options=$(echo "${args}" | grep -e '^-' -e '^+')           # オプション(-hoge, +hogeなど)のみ抽出

  # target単位でloop
  while read t; do
    # dnsサーバ単位でloop
    while read d; do
      # コマンドを組み立てて出力
      printf "${COLOR_TARGET_START}%s${COLOR_END} in ${COLOR_DNS_START}%s${COLOR_END}: %s\n" \
        "${t}" "${d}" "$(dig +short ${options} ${t} ${d} | sort -V | tr $'\n' , | sed 's/,$//')"
    done <<<"${dns}"
  done <<<"${target}"
}

使うとこんな感じになる。 digのオプションはある程度そのまま渡してるので、-xとかで逆引きも指定できるようにしてる。

@がついてたらDNSサーバとして扱うので、順不同で雑にブレース展開でドメイン作って渡すことができるようにしてる。

$ # ドメイン名で正引きする
$ ddig {bing,google}.{com,{co.,ne.,}jp,org,net} @{8.8.8.8,1.1.1.1} yahoo.co.jp
bing.com in @8.8.8.8: 13.107.21.200,204.79.197.200
bing.com in @1.1.1.1: 13.107.21.200,204.79.197.200
bing.co.jp in @8.8.8.8: 204.79.197.219
bing.co.jp in @1.1.1.1: 204.79.197.219
bing.ne.jp in @8.8.8.8:
bing.ne.jp in @1.1.1.1:
bing.jp in @8.8.8.8: 204.79.197.219
bing.jp in @1.1.1.1: 204.79.197.219
bing.org in @8.8.8.8: 213.186.33.5
bing.org in @1.1.1.1: 213.186.33.5
bing.net in @8.8.8.8: 204.79.197.200
bing.net in @1.1.1.1: 204.79.197.200
google.com in @8.8.8.8: 172.217.174.110
google.com in @1.1.1.1: 172.217.25.110
google.co.jp in @8.8.8.8: 216.58.197.163
google.co.jp in @1.1.1.1: 172.217.24.131
google.ne.jp in @8.8.8.8: 172.217.175.35
google.ne.jp in @1.1.1.1: 216.58.197.163
google.jp in @8.8.8.8: 172.217.26.3
google.jp in @1.1.1.1: 172.217.175.227
google.org in @8.8.8.8: 216.239.32.27
google.org in @1.1.1.1: 216.239.32.27
google.net in @8.8.8.8: 172.217.175.228
google.net in @1.1.1.1: 172.217.27.68
yahoo.co.jp in @8.8.8.8: 182.22.59.229,183.79.135.206
yahoo.co.jp in @1.1.1.1: 182.22.59.229,183.79.135.206

$ # IPアドレスをブレース展開で生成して逆引き指定する場合
$ ddig -x 192.168.0.{1..255} | grep -v ': $'
192.168.0.31 in : sv-xxx.local.
192.168.0.32 in : sv-yyy.local.
192.168.0.182 in : vm-zzz.local.