DNSの切替などで、大量のドメイン名に対してnslookupでDNSレコードを確認することがあった。
手作業でコマンドを実行するにはあまりに大変で、ミスも増える。おまけに記録にも残らないので、Powershellでスクリプトにした。
大量のドメインをリストとしてCSVに記載し、そのCSVをシェルに読み込ませて繰り返しnslookupをさせる。ドメイン名はざっくり2種類に分類した。1つはhttpプロトコルで参照する用のドメイン(ブラウザのURLに書いてあるドメイン名)として、AレコードとCNAMEレコードを確認したいもの。もう1つはメールなどのドメイン(アットマーク以降に記載のもの)で、MXとTXTレコードを確認したいもの。これらのドメインが大量にある場合、スクリプトを使って自動で実行する。
動作環境
・Windows 10 Pro Ver 22H2 OSビルド19045.2604
WindowsServerで実行したら動かなかったりするので、Powershellの動作確認って本当に難しい。Linuxのbashと勝手が違う。
ソースコード
まずはそのソースコードから。
#$Arg1は文字列型,リストを指定
Param([String]$Arg1)
#リストの存在確認
$csvfile = $Arg1
if (-not (Test-Path $csvfile)){
Write-Output "リストがないため、スクリプト終了"
exit 11
}
#リストを配列に格納
$array01 = Import-Csv $csvfile -Header type, FQDN
#DNSキャッシュを削除
ipconfig /flushdns
#forによる配列読み込み
foreach ($i in $array01) {
#時刻取得
Get-Date -Format F
#Aレコード、CNAMEレコードの条件分岐
If($i.type -eq "web"){
Write-Output ("nslookup -type=cname "+$i.FQDN)
nslookup -type=cname $i.FQDN
Write-Output ("nslookup -type=a "+$i.FQDN)
nslookup -type=a $i.FQDN
#MXレコード、TXTレコードの条件分岐
}elseif($i.type -eq "mail"){
Write-Output ("nslookup -type=mx "+$i.FQDN)
nslookup -type=mx $i.FQDN
Write-Output ("nslookup -type=txt "+$i.FQDN)
nslookup -type=txt $i.FQDN
# 例外処理
}else{
Write-Output "リスト1列目の指定エラー(web/mail以外)のためスクリプト終了"
exit 12
}
}
リストCSVの存在確認を行い、存在しなければ11をエラーコードとして返す。
リストCSVを読み込んで、1列目にwebまたはmailの指定がなければ、エラーコード12を返す。
色んなエラーハンドリングを書いてたけど(引数チェックとか、リスト2列目が空の場合とか)、別に無償奉仕だったしそこまでやらんでええわ、と思ったのであきらめた。リファクタリングは適宜実施。
リスト
スクリプトに読み込ませるリストをCSV形式で作成する。
mail,yahoo.co.jp
mail,gmail.com
mail,outlook.com
web,www.yahoo.co.jp
web,www.google.com
mailと書いている行はメールのドメイン名。MXとTXT(SPF)レコードを返す。
webはwebサイトのドメイン名。AとCNAMEレコードを返す。
実行
Powershellを開いてコマンドをたたく。
実行結果のログを残して保存しておきたいので、そういう形で実行する。
ここではC:\Users\localというフォルダにスクリプトとリストを保存している。
空ログファイル作成
PS C:\Users\local> $USERDESKTOP=[System.Environment]::GetFolderPath("Desktop")
PS C:\Users\local> $LOGDATE=(Get-Date).ToString("yyyyMMdd-HHmmss")
PS C:\Users\local> New-Item -type file $USERDESKTOP\nslookup-list_$LOGDATE.log
# ↑デスクトップにログファイル(空)を生成している。
空のログファイル(nslookup-list_yyyyMMdd-HHmmss.log)をデスクトップ作成した。作成したファイルはスクリプト実行が終わるまで開かないこと。
nslookupスクリプト実行
この記録する器ができたらスクリプトを実行。
PS C:\Users\local> .\nslookup-list.ps1 .\list.csv > $USERDESKTOP\nslookup-list_$LOGDATE.log
デスクトップの空ログファイル(nslookup-list_yyyyMMdd-HHmmss.log)に実行結果が保存される。ログの中身を確認
ログ確認
PS C:\Users\local> cat $USERDESKTOP\nslookup-list_$LOGDATE.log
Windows IP 構成
DNS リゾルバー キャッシュは正常にフラッシュされました。
2023年2月17日 13:54:31
nslookup -type=mx yahoo.co.jp
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
yahoo.co.jp MX preference = 10, mail exchanger = mx5.mail.yahoo.co.jp
yahoo.co.jp MX preference = 10, mail exchanger = mx3.mail.yahoo.co.jp
yahoo.co.jp MX preference = 10, mail exchanger = mx2.mail.yahoo.co.jp
yahoo.co.jp MX preference = 10, mail exchanger = mx1.mail.yahoo.co.jp
nslookup -type=txt yahoo.co.jp
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
yahoo.co.jp text =
"google-site-verification=GvbYgNin-mY73VbS4IJK2D8nI3tHEf2NpRdy76VYqBU"
yahoo.co.jp text =
"v=spf1 include:spf.yahoo.co.jp ~all"
2023年2月17日 13:54:31
nslookup -type=mx gmail.com
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
gmail.com MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com MX preference = 30, mail exchanger = alt3.gmail-smtp-in.l.google.com
gmail.com MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com
gmail.com MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
gmail.com MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com
gmail-smtp-in.l.google.com AAAA IPv6 address = 2404:6800:4008:c05::1a
alt1.gmail-smtp-in.l.google.com AAAA IPv6 address = 2607:f8b0:4023:c0b::1b
nslookup -type=txt gmail.com
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
gmail.com text =
"v=spf1 redirect=_spf.google.com"
gmail.com text =
"globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
2023年2月17日 13:54:32
nslookup -type=mx outlook.com
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
outlook.com MX preference = 5, mail exchanger = outlook-com.olc.protection.outlook.com
nslookup -type=txt outlook.com
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
outlook.com text =
"google-site-verification=DC2uC-T8kD33lINhNzfo0bNBrw-vrCXs5BPF5BXY56g"
outlook.com text =
"v=spf1 include:spf-a.outlook.com include:spf-b.outlook.com ip4:157.55.9.128/25 include:spf.protection.outlook.com include:spf-a.hotmail.com include:_spf-ssg-b.microsoft.com include:_spf-ssg-c.microsoft.com ~all"
outlook.com text =
"google-site-verification=0iLWhIMhXEkeWwWfFU4ursTn-_OvoOjaA0Lr7Pg1sEM"
2023年2月17日 13:54:32
nslookup -type=cname www.yahoo.co.jp
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
www.yahoo.co.jp canonical name = edge12.g.yimg.jp
nslookup -type=a www.yahoo.co.jp
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
名前: edge12.g.yimg.jp
Address: 183.79.219.252
Aliases: www.yahoo.co.jp
2023年2月17日 13:54:32
nslookup -type=cname www.google.com
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
google.com
primary name server = ns1.google.com
responsible mail addr = dns-admin.google.com
serial = 510093512
refresh = 900 (15 mins)
retry = 900 (15 mins)
expire = 1800 (30 mins)
default TTL = 60 (1 min)
nslookup -type=a www.google.com
サーバー: UnKnown
Address: 2404:1a8:7f01:b::3
名前: www.google.com
Address: 142.251.42.196
以降は
・空ログファイル作成
・nslookupスクリプト実行
を繰り返す。繰り返すことで、複数ログファイルができ、それをdiffることで差分を確認できる。
余談
久々にPowershell使ったけど、構文が長くて大変。
マルーン5とか久しく聞いてなかったですが、ボーカルが嫁さんいるのにスキャンダルしたとニュースがあった。でも、この人らの歌っていつもそういう歌(愛する人がいるけれど、他の誰かも好きになって”行動しちゃった”系。ちょっと同じ人間としてどうかしてる、非常に動物的な雰囲気の歌詞)だったじゃないですが・・・。なんの驚きもないっす。「でしょうね」としか思えなかった。
ちなみに私はこの歌(のリズム)が好きです。当然歌詞はクズいです。
Makes Me Wonder Closed Captioned - Maroon5