複数のdnsサーバーに一度に問い合わせるスクリプトを改良した②

以下のリンクで書いていた問題点を解消するスクリプトを書いてみた。

複数のdnsサーバーに一度に問い合わせるスクリプトを改良した
以下のエントリーの積み残しである引数を付与して1行で完結するコマンドを作成してみた。hostコマンドのオプションの場合だけ対応するという省機能のスクリプトだけどないよりはよいでしょう。 ./name_resovl.sh #!/bin/bas...

修正箇所

冗長な処理はすべて関数にしたのでアルゴリズムのところはすっきりしたはず。

以下関数の解説

lg_exst_chck 

同名のログが存在する場合は、カウントアップして新たなログを作成。
1ドメインあたり、1日最大まで999個作成可能だが、1000個目以降はナンバリングされずすべて上書。

cmd_hlp

helpを呼び出す。

function intrctv_md 

対話モードで実行

function cmd_md 

hostコマンド実行 事前に$cmdにオプションも含めたコマンドを格納する必要あり

name_resovl_cnt.sh

#!/bin/bash

cmd=""
dlist="8.8.8.8 9.9.9.9 9.9.9.10 1.1.1.1"
date=`date +%Y%m%d`
cnt="01"
fqdn="google.com"
opt=""
logs="./logs"
i="array"

#logファイルが1個以上存在する場合、末尾の一番大きい番号をカウントアップして新規作成
#最大999個作成可能

function lg_exst_chck () {
        for cnt in `seq -f %03g 1 999`
        do
            if
                [ ! -f $logs${cnt}.log ];then
                logs=$logs${cnt}.log
                break
            fi
        done
}

#helpを呼び出す
function cmd_hlp () {
                echo "This script use
host command - DNS lookup utility"
                echo "OPTIONS"
                echo "-t a     FQDN answer A Record."
                echo "-t aaaa  FQDN answer AAAA Record."
                echo "-t ptr   FQDN answer MX Record."
                echo "-t mx    FQDN answer MX Record."
                echo "-t cname FQDN answer CNAME Record."
                echo "-t txt   FQDN answer TXT Record."
                echo "Example: $0 -t a google.com"
}

#対話モード
function intrctv_md () {
read -t 120 -p "Input FQDN
resolution host(default:$fqdn): " fqdn

        case "$fqdn" in
                "") fqdn=google.com
                        ;;
                *)
                        ;;
        esac

read -t 120 -p "Input RRset
resolution zone <<A,AAAA,PTR,MX,TXT,ALL>>(default:None):" opt
        case "$opt" in
             A ) opt="-t a"
                        ;;
          AAAA ) opt="-t aaaa"
                        ;;
           PTR ) opt="-t ptr"
                        ;;
            MX ) opt="-t mx"
                        ;;
           TXT ) opt="-t txt"
                        ;;
           ALL ) opt="-a"
                        ;;
            "" ) opt=""
                        ;;
              *) echo -e "Cannot
understand your answer.\nRetype name resolution zone \n"
                        exit 0
                        ;;
        esac
}
#hostコマンド実行 事前に$cmdにコマンドを格納する必要あり
function cmd_md () {
        for i in $dlist
        do
                echo "##### name server$i "
                echo "##### $cmd $i"
                $cmd $i
        done > $logs
        echo -e "\ncreate name resoluton result.\nlooking for current directory.\nfile: $logs"
}

#以下実行処理

#logsディレクトリがない場合作成
[ ! -e $logs ] && mkdir -p  $logs
if  [ "$1" = "-h" ] || [ "$1" = "--help" ]
        then
cmd_hlp
        elif

        [ $# = 0 ]
        then
intrctv_md
logs="./logs/resolv_"$date"_"$fqdn"_"

lg_exst_chck
opt="$opt $fqdn"
cmd="host $opt"
cmd_md
        elif
        [ "$1" != "-t" ]
        then
                echo -e "Error! Invalidarguments!\nRun "$0 -h" and try again!"
        else
logs="./logs/resolv_"$date"_"$3"_"
lg_exst_chck
cmd="host $@"
cmd_md
fi

実行結果

スクリプト実行後、./logs/resolv_YYYYMMDD_{FQDN}_{NNN}.logというファイルを出力する。

何も指定しない場合、google.comを問い合わせてくる。

./name_resolv_cnt.sh
Input FQDN
resolution host(default:google.com):
Input RRset
resolution zone <<A,AAAA,PTR,MX,TXT,ALL>>(default:None):

create name resoluton result.
looking for current directory.
file: ./logs/resolv_20211128_google.com_003.log

ログファイルの中身は以下の通り。

ネームサーバー毎に改行した方が見やすいかも。

##### name server8.8.8.8
##### host  google.com 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:

google.com has address 172.217.175.238
google.com has IPv6 address 2404:6800:4004:811::200e
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
##### name server9.9.9.9
##### host  google.com 9.9.9.9
Using domain server:
Name: 9.9.9.9
Address: 9.9.9.9#53
Aliases:

google.com has address 172.217.25.110
google.com has IPv6 address 2404:6800:4004:826::200e
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
##### name server9.9.9.10
##### host  google.com 9.9.9.10
Using domain server:
Name: 9.9.9.10
Address: 9.9.9.10#53
Aliases:

google.com has address 142.251.42.174
google.com has IPv6 address 2404:6800:4004:821::200e
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
##### name server1.1.1.1
##### host  google.com 1.1.1.1
Using domain server:
Name: 1.1.1.1
Address: 1.1.1.1#53
Aliases:

google.com has address 172.217.31.174
google.com has IPv6 address 2404:6800:4004:821::200e
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.

応用

for文を利用することで、複数のFQDNを一度に参照可能。

以下のファイルを作成。

cat fqdn
google.com
yahoo.co.jp

ファイル:fqdnをforで回す。

すると参照ログを一度に複数出力できるので、DNSで作業した後の一覧確認が楽になるかも。

for i in `cat fqdn` ; do ./name_resolv_cnt.sh -t a $i ; done

create name resoluton result.
looking for current directory.
file: ./logs/resolv_20211128_google.com_001.log

create name resoluton result.
looking for current directory.
file: ./logs/resolv_20211128_yahoo.co.jp_001.log

積み残し

以下の内容はいずれ解消したい。できない場合はやらないよう決めてしまいたい。

  • ゾーン指定時のオプションで小文字が使えない(正規表現使おうとして失敗した)
  • 名前解決するホストを一度に複数登録できるような機能を追加する
  • 対話形式、ワンライナーどちらもすべて同じ変数を利用するようにしたい

コメント

タイトルとURLをコピーしました