## page was copied from DnsTemplate ##master-page:HelpTemplate <> <> 指定したドメインのNSレコードから、そのドメインを管理しているネームサーバーのホスト名を抽出 dnspython を使う。 実行方法: {{{ 上記のコードを get_ns_records.py のようなファイル名で保存します。 ターミナル(コマンドプロンプト)で以下のコマンドを実行します。 Bash python get_ns_records.py 実行すると、ドメイン名の入力を求められるので、調査したいドメイン名(例: google.com や example.com)を入力してEnterキーを押してください。 }}} そのドメインのNSレコード値(ネームサーバーのホスト名)がリスト形式で出力されます。 これで、指定したドメインのNSレコードから、そのドメインを管理しているネームサーバーのホスト名を抽出できます。 {{{ # -*- coding: utf-8 -*- # 必要なライブラリをインポート import dns.resolver import sys # 標準エラー出力用 def get_ns_record_values(domain_name): """ 指定されたドメイン名のNSレコードからレコード値(ネームサーバーのホスト名)を取得します。 Args: domain_name (str): NSレコードを照会するドメイン名。 Returns: list[str]: NSレコード値(ネームサーバーのホスト名)のリスト。 取得に失敗した場合やレコードが存在しない場合は空のリストを返します。 None: ドメインが存在しないなど、致命的なエラーが発生した場合。 (呼び出し元で判定しやすいように) """ ns_values = [] try: # 指定されたドメイン名とレコードタイプ'NS'でDNS解決を試みる # dns.resolver.resolve() は推奨されるメソッドです answers = dns.resolver.resolve(domain_name, 'NS') # 回答 (dns.resolver.Answer オブジェクト) の各レコードデータ (rdata) から # ターゲット(ネームサーバー名)を取得 for rdata in answers: # rdata.target は dns.name.Name オブジェクトなので、 # 末尾のドットを含めて文字列に変換するために str() を使用 ns_values.append(str(rdata.target)) return ns_values except dns.resolver.NXDOMAIN: # ドメインが存在しない場合のエラー print(f"エラー: ドメイン '{domain_name}' が見つかりません。", file=sys.stderr) return None # 致命的なエラーとして None を返す except dns.resolver.NoAnswer: # レコードが見つからない (ドメイン自体は存在する可能性がある) print(f"情報: ドメイン '{domain_name}' にはNSレコードが設定されていません。", file=sys.stderr) return [] # レコードがないだけなので空リスト except dns.exception.Timeout: # DNSクエリがタイムアウトした場合のエラー print(f"エラー: ドメイン '{domain_name}' のDNSクエリがタイムアウトしました。", file=sys.stderr) return [] # 一時的な問題かもしれないので空リスト except dns.resolver.NoNameservers: # 権威ネームサーバーに到達できない場合のエラー print(f"エラー: ドメイン '{domain_name}' の権威ネームサーバーに到達できませんでした。", file=sys.stderr) return [] # 一時的な問題かもしれないので空リスト except Exception as e: # その他の予期せぬエラー print(f"予期せぬエラーが発生しました ({type(e).__name__}): {e}", file=sys.stderr) return [] # 予期せぬエラーでも空リスト # --- メインの実行部分 --- if __name__ == "__main__": # ユーザーにドメイン名の入力を促す target_domain = input("NSレコードを取得したいドメイン名を入力してください (例: google.com): ") if target_domain: print(f"\n'{target_domain}' のNSレコードを検索中...") # 関数を呼び出してNSレコード値を取得 ns_records = get_ns_record_values(target_domain) # 結果を出力 if ns_records is None: # ドメインが存在しない場合など (エラーメッセージは関数内で出力済み) print(f"'{target_domain}' のNSレコード検索を中止しました。") elif ns_records: print(f"\n--- {target_domain} の NSレコード値 ---") for record in ns_records: print(record) print("------------------------------------") else: # レコードが見つからなかった、またはタイムアウト等で空リストが返された場合 # (メッセージは関数内で出力されている場合もある) print(f"'{target_domain}' からNSレコード値を取得できませんでした、またはレコードが存在しません。") else: print("ドメイン名が入力されていません。", file=sys.stderr) }}} == history == {{{ }}} ---- CategoryDns CategoryWatch CategoryTemplate